2

更新:最后的解决方案


我有一个 Winform,label1 将使用从条码扫描器通过txtBoxCatchScanner.

场景是人们在通过接待处时在扫描仪下刷他们的 MemberID 卡,Winform 自动在该 MemberID 上进行搜索并返回他们的信息,例如在接待员的 PC 上返回他们的信息,其中 winForm 在她的一角桌面。

我的以下代码在第一次滑动时工作正常(例如第一人称)

数字 MemberID,例如 00888 出现在文本框中,ADO.NET 从 SQL 中提取数据并正常显示。

可能需要注意的一件事,光标在 memberID 的末尾:00888|

到目前为止一切顺利,然后:

当滑动 2(例如下一个人)发生时

他们的数字(比如,00999)被放在 txtBox 中第一个的末尾,例如:0088800999 所以当 TextChanged 触发时,它自然会搜索 0088800999 而不是 00999 ....

我试过了:

txtBoxCatchScanner.Clear();

txtBoxCatchScanner.Text = "";

并重新加载表格

在我的代码末尾“刷新”文本框

但我猜他们会触发 TextChanged 事件

在上一次滑动完成后,我如何重新聚焦或...清除旧数字和光标回到 txtBox 的开头...

我是初学者,所以我确定下面的代码很垃圾......

但是,如果有人有时间,请让我知道如何修复它以做我想做的事。

更新:

好的,经过多次试验,我现在已经设法让这 1/2 工作了,希望有更多经验的人可以帮助我完成!:P

if (txtBoxCatchScanner.Text.Length == 5)
{
label1.Text = txtBoxCatchScanner.Text; // just a label for testing .. shows the memmber ID
txtBoxCatchScanner.Select(0, 5);
}

所以扫描 1,说 00888 ,然后突出显示,扫描 2 ,说 00997 ......甜!覆盖(不附加到)00888 并做到这一点...扫描 2 0011289 ... DOH!

问题:并非所有条形码都是 5 位数字!!它们是随机长度!!会员 ID 范围从 2 位(例如 25)到 10 位,未来还会增长...

编辑:我发现条形码被读取为单独的按键。我认为这就是为什么下面的答案 1 不起作用,而大问题是:

例如,对于 00675,来自扫描仪的输入(?输出)是:

Down: Do Up: Do Down: Do Up: Do Down: D6 Up: D6 Down: D7 Up: D7 Down: D5 Up: D5 down: Retunn Up: Return

其他信息:条码扫描器是:Opticon OPL6845 USB

谢谢

private void txtBoxCatchScanner_TextChanged(object sender, EventArgs e)
{             
    Member member = new Member();
    member.FirstName = "";
    member.LastName = "";            

    //Get BarCode
    //VALIDATE: Is a Number           
    double numTest = 0;
    if (Double.TryParse(txtBoxCatchScanner.Text, out numTest))
    {
        //IS A NUMBER
        member.MemberID = Convert.ToInt32(txtBoxCatchScanner.Text);

        //SEARCH
        //Search Member by MemberID (barcode)
        List<Member> searchMembers = Search.SearchForMember(member);

        if (searchMembers.Count == 0)
        {
            lblAlert.Text = "No Member Found";
        }
        else
        {
            foreach (Member mem in searchMembers)
            {
                lblMemberStatus.Text = mem.MemberStatus;
                lblMemberName.Text = mem.FirstName + " " + mem.LastName;
                lblMemberID.Text = mem.MemberID.ToString();

                lblMessages.Text = mem.Notes;

                if (mem.MemberStatus == "OVERDUE") // OR .. OR .. OR ...
                {
                    lblAlert.Visible = true;
                    lblAlert.Text = "!! OVERDUE !!";

                    //PLAY SIREN aLERT SOUND
                    //C:\\WORKTEMP\\siren.wav
                    SoundPlayer simpleSound = 
                        new SoundPlayer(@"C:\\WORKTEMP\\siren.wav");
                    simpleSound.Play();
                }
                else
                {
                    lblAlert.Visible = true;
                    lblAlert.Text = mem.MemberStatus;
                }
            }
        }
    }
    else
    {
        //IS NOT A NUMBER
        lblAlert.Text = "INVALID - NOT A NUMBER";                

        ////
        //lblMemberName.Text = "";
        //lblMemberID.Text = "";
        //lblMemberID.Text = "";
    }

解决方案:

系统不会让我再过 3 个小时回答我自己的问题,因为我是新手,只有 1 个帖子,所以会放在这里:

首先感谢大家的帮助和耐心。

我终于想出了一个解决方案,尚未在凌晨 2 点和就寝时间进行全面测试。

从我的更新开始,我取得了成功,但遇到了 MemberID 问题的可变长度。我现在用下面的代码克服了这个问题:

namespace SCAN_TESTING
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void txtBoxCatchScanner_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)Keys.Return)
        {
            e.Handled = true;

            int barcodeLength = txtBoxCatchScanner.TextLength;

            txtBoxCatchScanner.Select(0, barcodeLength);

            //TEST
            label3.Text = barcodeLength.ToString();
            //TEST
            label2.Text = txtBoxCatchScanner.Text;

        }

    }

我将把它添加到我之前的“真实”代码中并在早上进行测试但是在这个阶段正在做我想要的!=]

更新:测试它..完全符合需要:

private void txtBoxCatchScanner_KeyUp(object sender, KeyEventArgs e)
{
   if (e.KeyValue == (char)Keys.Return)
      {
            e.Handled = true;

            int barcodeLength = txtBoxCatchScanner.TextLength;

            txtBoxCatchScanner.Select(0, barcodeLength);

           //
           //INSERT ORGINAL CODE HERE. No Changes were needed.
           //


      }//end of if e.KeyValue ...
}//end txtBoxCatchScanner_KeyUp

希望对以后的人有帮助!!:)

再次感谢 2 个非常好的解决方案,我可以看到它们是如何工作的,并且学到了很多东西。只是在我的情况下不起作用 - 更可能是由于我自己或我的错误/不理解,或扫描仪类型。

4

3 回答 3

3

我不确定实际问题是什么。

txtBoxCatchScanner.Clear();
txtBoxCatchScanner.Text = "";

两者都会触发“已更改”事件。但他们也清除了盒子。所以这应该是你想要做的。

您可以在开始时检查该框是否实际上是空的,如果是则返回。喜欢:

if(txtBoxCatchScanner.Text == "" |txtBoxCatchScanner.Text == string.Empty)
return;

因此,如果盒子是空的,则不会发生其他任何事情。

如果我误解了您的问题,请说明,我会尽力提供帮助。

问候

编辑:

如果它看起来像这样,您的函数应该可以工作:

    private void txtBoxCatchScanner_TextChanged(object sender, EventArgs e)
{             
Member member = new Member();
member.FirstName = "";
member.LastName = "";            

if(txtBoxCatchScanner.Text == "" | txtBoxCatchScanner.Text == string.Empty)
return;    // Leave function if the box is empty

//Get BarCode
//VALIDATE: Is a Number           
int numTest = 0;
if (int.TryParse(txtBoxCatchScanner.Text, out numTest))
{
    //IS A NUMBER
    //member.MemberID = Convert.ToInt32(txtBoxCatchScanner.Text);
    member.MemberID = numTest; // you already converted to a number...
    //SEARCH
    //Search Member by MemberID (barcode)
    List<Member> searchMembers = Search.SearchForMember(member);

    if (searchMembers.Count == 0)
    {
        lblAlert.Text = "No Member Found";
    }
    else
    {
        foreach (Member mem in searchMembers)
        {
            lblMemberStatus.Text = mem.MemberStatus;
            lblMemberName.Text = mem.FirstName + " " + mem.LastName;
            lblMemberID.Text = mem.MemberID.ToString();

            lblMessages.Text = mem.Notes;

            if (mem.MemberStatus == "OVERDUE") // OR .. OR .. OR ...
            {
                lblAlert.Visible = true;
                lblAlert.Text = "!! OVERDUE !!";

                //PLAY SIREN aLERT SOUND
                //C:\\WORKTEMP\\siren.wav
                SoundPlayer simpleSound = 
                    new SoundPlayer(@"C:\\WORKTEMP\\siren.wav");
                simpleSound.Play();
            }
            else
            {
                lblAlert.Visible = true;
                lblAlert.Text = mem.MemberStatus;
            }
        }
    }
}
else
{
    //IS NOT A NUMBER
    lblAlert.Text = "INVALID - NOT A NUMBER";                

    ////
    //lblMemberName.Text = "";
    //lblMemberID.Text = "";
    //lblMemberID.Text = "";
}
txtBoxCatchScanner.Clear();
}
于 2013-01-23T10:29:21.537 回答
3

您使用的条形码扫描仪似乎起到 HID 的作用 - 一种键盘仿真。我知道的每个简单的条形码扫描仪(我每天都在使用它们)可以选择为扫描的条形码指定后缀。将后缀更改为CRLF并向表单添加默认按钮。扫描以结尾的条形码CRLF将自动“按下按钮”。

将执行检查的代码从TextChanged事件移入按钮Click事件的事件处理程序并删除TextChanged事件处理程序。然后,当单击按钮时,也清除文本框并将焦点设置回文本框。

你现在应该可以走了。

您可以轻松检查条形码扫描仪是否已经配置了正确的后缀:打开记事本并扫描一些条形码。如果它们都出现在不同的行上,那么一切都很好。否则,您需要扫描扫描仪手册中的一些配置条码。

总而言之,这应该是按钮Click事件的代码:

private void btnCheckMember_Click(object sender, EventArgs e)
{             
    Member member = new Member();
    member.FirstName = "";
    member.LastName = "";            

    string memberText = txtBoxCatchScanner.Text.Trim();
    txtBoxCatchScanner.Text = String.Empty;

    int numTest = 0;
    if (String.IsNullOrEmpty(memberText) ||!Int32.TryParse(memberText, out numTest))
    {
        //IS NOT A NUMBER
        lblAlert.Text = "INVALID - NOT A NUMBER";                
        return;
    }

    member.MemberID = numTest;
    List<Member> searchMembers = Search.SearchForMember(member);

    if (searchMembers.Count == 0)
    {
        lblAlert.Text = "No Member Found";
    }
    else
    {
        foreach (Member mem in searchMembers)
        {
            lblMemberStatus.Text = mem.MemberStatus;
            lblMemberName.Text = mem.FirstName + " " + mem.LastName;
            lblMemberID.Text = mem.MemberID.ToString();

            lblMessages.Text = mem.Notes;

            if (mem.MemberStatus == "OVERDUE") // OR .. OR .. OR ...
            {
                lblAlert.Visible = true;
                lblAlert.Text = "!! OVERDUE !!";

            SoundPlayer simpleSound = new SoundPlayer(@"C:\\WORKTEMP\\siren.wav");
            simpleSound.Play();
        }
        else
        {
            lblAlert.Visible = true;
            lblAlert.Text = mem.MemberStatus;
        }
    }
}

该解决方案避免了以下问题:

  1. 在文本框内容中添加/删除每个字符时触发事件(扫描条形码时也是如此:它们被一个一个添加,就像在键盘上输入一样)
  2. 1.对每个输入的字符进行成员检查的问题
  3. 2.数据库中XYZ有成员就永远找不到成员的问题,找到XY后就停止检查XY
  4. 导致 3.XY也找不到 member 的问题,但只有 member Z,因为在 3. 中,文本框被清除并且Z是唯一输入的字符。
于 2013-01-23T12:41:34.580 回答
1

在下一个 textChange 事件中清除 textBox 的最佳方法。

插入这一行

txtBoxCatchScanner.SelectAll();

在 TextChange 函数的末尾。这将选择文本,以便在下一个事件中轻松替换我。

于 2013-11-19T11:07:16.710 回答