【问题标题】:TextBox autocomplete and default buttons文本框自动完成和默认按钮
【发布时间】:2010-11-07 07:33:21
【问题描述】:

我在表单上有一个带有自动完成功能的 .NET 文本框。该表单还定义了 AcceptButton 和 CancelButton。如果我尝试使用 Enter 键提交建议或使用 Esc 关闭下拉菜单,我的表单将关闭。 如何防止这种行为?

【问题讨论】:

    标签: c# .net winforms textbox autocomplete


    【解决方案1】:

    另一种选择是派生您自己的自定义 TextBox 类,该类在按下 Enture/Return 时执行验证:

    public class MyTextBox : TextBox
    {
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Enter || keyData == Keys.Return)
            {
                // Perform validation here
                return true;
            }
            else
                return false;
        }
    }
    

    【讨论】:

      【解决方案2】:

      简单的方法是在自动完成文本框中删除 AcceptButtonCancelButton 属性:

          public Form1()
          {
              InitializeComponent();
      
              txtAuto.Enter +=txtAuto_Enter;
              txtAuto.Leave +=txtAuto_Leave;
          }
      
          private void txtAC_Enter(object sender, EventArgs e)
          {
              AcceptButton = null;
              CancelButton = null;
          }
      
          private void txtAC_Leave(object sender, EventArgs e)
          {
              AcceptButton = btnOk;
              CancelButton = btnCancel;
          }
      

      【讨论】:

        【解决方案3】:

        您可以采用以下方法,而不是接受和取消按钮:

        1. 将表单的 KeyPreview 属性设置为 true。
        2. 处理表单的KeyDown事件,在handler方法中你可以有类似下面代码的东西

          switch (e.KeyCode)
          {
              case Keys.Enter:
              {
                  if (!txtAuto.Focused)
                  {
                      Save();
                  }
                  break;
              }
              case Keys.Escape:
              {
                  if (!txtAuto.Focused)
                  {
                      Close();
                  }
                  break;
              }
          }
          

        【讨论】:

        • 表单的KeyDown事件不会被触发。
        【解决方案4】:

        不要分配 AcceptButton 和 CancelButton 表单属性。在按钮的 OnClick 事件中设置 DialogResult。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-25
          • 1970-01-01
          • 1970-01-01
          • 2011-04-18
          • 2010-09-22
          相关资源
          最近更新 更多