【问题标题】:Message boxes not firing on textbox change event文本框更改事件未触发消息框
【发布时间】:2014-12-02 19:26:38
【问题描述】:

我在 Winform 文本框的 TextChanged 事件中有一段 c# 代码。几个被调用的空位都附有消息框,因此操作员知道它们是否有有效数据。不幸的是,这些调用被完全跳过。我用 show() 而不是 showdialog() 调用了有问题的表单,以消除模态表单。还是没有肥皂。该事件由条形码扫描仪触发。代码如下:

private void txtScanCode_TextChanged(object sender, EventArgs e)
{
    string barCode;
    barCode = txtScanCode.Text;

    if (txtScanCode.Text.Length == 12)
    {
        MessageBox.Show(this, "Hey, look!", "A message box!", 
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

        FindScanItem(barCode);
        barCode = "";
        txtScanCode.SelectionStart = 0;
        txtScanCode.SelectionLength = txtScanCode.Text.Length;
    }
}

我怀疑这是文本更改和按键的组合,但不确定应该如何正确触发它。

【问题讨论】:

  • 我不是TextChanged 的粉丝,主要是因为它不可靠。你试过LostFocus 什么的吗?所以一旦失去控制焦点,它就会触发事件。
  • TextChanged 事件是否被触发?你是否在其中设置了断点并验证了'if'语句中的条件为真?
  • @Rufus TextChanged 事件确实会触发。它甚至执行数据功能。它只是讨厌 MessageBox.Show()。
  • 不,它没有。您的代码工作正常。它可能是多行的吗?另外:我们没有看到 Keypress 事件!向我们展示所有相关代码!
  • 嗯,你的代码对我来说很好用。不确定您所说的“数据功能”是什么意思?

标签: c# winforms


【解决方案1】:

一个半星期后,我得到了答案,经过测试和验证。 TaW 和 BillRuhl 在 Leave 和 KeyPress 方面走在了正确的轨道上。当这些都不起作用时,我终于点击了 KeyUp 事件。

一点背景。通用键盘楔形 USB 扫描仪会自动添加一个回车符,修剪 "\r\n" 或 Environment.Newline() 不会删除。在多次尝试使用不同的组合和按键之后,我发现应用程序在关闭它之前触发了一个表单。条码扫描器与普通的键盘输入或剪切和粘贴不同,它会在事件期间继续向任何监听它的对象发送回车键。我知道。越野车。但是如果我们改为触发 keyup 事件,像这样......

private void txtScanCode_KeyUp(object sender, System.Windows.Forms.KeyEventArgs e)
   {

       if (e.KeyCode == Keys.Enter)
       {
           e.SuppressKeyPress = true;

           barCode = txtScanCode.Text.Trim().ToString();
           if (!doDataStuff) //This boolean is instantiated as false
           {
               if (txtScanCode.Text.Length == 12)
               {
                   doDataStuff = true; //boolean tells the app go run data functions.
                   MessageBox.Show(this, "Pop up worked!", "Cool!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                   getData(barCode); //Data methods performed on the barcode
                   barCode = "";
                   txtScanCode.Focus();
                   txtScanCode.SelectionStart = 0;
                   txtScanCode.SelectionLength = txtScanCode.Text.Length;
               }
           }
       }
   }

...我们只寻找一个输入键,验证字符串的长度(在这种情况下,“==12”对于验证是必不可少的),并使用 KeyEventArgs 过滤掉 Keys.Enter。与一个警告完美配合。 KeyUp 实际上在表单级别上工作,因此它也会在其他文本框上触发。在这种情况下,txtScanCode 是唯一具有数据绑定函数的函数,因此编写所有验证以检查该控件。

感谢大家的参与。我想我们已经打破了谷歌几次试图解决这个问题。

【讨论】:

    【解决方案2】:

    我刚刚进行了复制/粘贴测试,我认为问题可能出在您的if 条件下。如果我复制超过 12 个字符并将其粘贴到文本框中,则不会触发“if”语句。

    这个简单的改变似乎解决了这个问题:

    if (textBox1.Text.Length >= 12)
    {
        MessageBox.Show(this, "Hey, look!", "A message box!",
            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
    
        // the rest of your code here
        // (you may want to do some additional validation 
        // on the text if it's more than 12 characters)
    }
    

    【讨论】:

      【解决方案3】:

      尝试不同的事件...离开事件的运气比 TextChanged 事件的好。所以你的方法看起来像:

      private void txtScanCode_Leave(object sender, EventArgs e)
      {
      string barCode;
      barCode = txtScanCode.Text;
      
       if (txtScanCode.Text.Length == 12)
       {
          MessageBox.Show(this, "Hey, look!", "A message box!", 
              MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
      
          FindScanItem(barCode);
          barCode = "";
          txtScanCode.SelectionStart = 0;
          txtScanCode.SelectionLength = txtScanCode.Text.Length;
       }
      }
      

      别忘了连接 Leave 事件...

      希望有所帮助 比尔

      【讨论】:

      • this.txtScanCode.Leave += new System.EventHandler(this.txtScanCode_Leave);
      • 这不起作用,但我会玩弄它。 TaW 提到了按键,所以我也可以尝试一下。
      • @BobRuhl 见上文。该代码有效,但在我扫描条形码时无效。所以我们可能完全在看别的东西。
      • 这是问题所在。当我扫描到文本框时,更改的事件会传递一个回车符。我试过剥离 System.Environment.NewLine() 和 ("\r\n") 无济于事。发生了什么,即使在 textbox_Leave 事件上,系统也认为输入已被按住。因此,当消息框触发时,这个“回车键”会在用户看到它之前触发 OK 按钮。它是一个键盘楔,不能为特定的扫描仪编程。
      【解决方案4】:

      只需输入MessageBox.Show("ble");,然后输入MessageBox.Show("blu);"blu" 就会触发。

      【讨论】:

        猜你喜欢
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        • 2011-01-14
        • 1970-01-01
        相关资源
        最近更新 更多