【问题标题】:Binding an event to all TextBox 'es in a winform将事件绑定到 winform 中的所有 TextBox 'es
【发布时间】:2012-02-27 20:33:28
【问题描述】:

我的单个 winform 应用程序中有很多文本框。我正在寻找一种在表单加载时或其构造函数中将单个事件方法绑定到所有这些文本框的方法,因此我不会将事件添加到设计器中的每个文本框。

在这种情况下,我想检测 ENTER 键,然后以编程方式单击一个按钮:

private void ApplyFilterOnEnterKey(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Enter)
    {
        btnApplyFilters_Click(this, null);
    }
}

现在的问题是如何遍历表单中的所有文本框并将它们绑定到上述方法?我的文本框无处不在,在嵌套的表格布局面板或嵌套的普通面板中。这个循环会是什么样子,我应该把它放在哪里?在表单构造函数中还是在加载事件中?!

【问题讨论】:

    标签: c# winforms events textbox keydown


    【解决方案1】:
        private void TextBoxFocusIn(object sender, EventArgs e)
        {
            TextBox textBox = (TextBox)sender;
            if (textBox.Text == "Encrypted value here...")
            {
                textBox.Text = "";
                textBox.ForeColor = Color.Black;
            }
        }
    
        private void TextBoxFocusOut(object sender, EventArgs e)
        {
            TextBox textBox = (TextBox)sender;
            if (textBox.Text =="")
            {
                textBox.Text = "Encrypted value here...";
                textBox.ForeColor = Color.Gray;
            }
        }
    
    
        private void BindPlaceHolderInTextbox(Panel contentPanel)
        {
             foreach(Control control in contentPanel.Controls)
            {
                if(control.GetType() == typeof(TextBox))
                {
                    control.Text = "Encrypted value here...";
                    control.ForeColor = Color.Gray;
                    control.GotFocus += new System.EventHandler(TextBoxFocusIn);
                    control.LostFocus += new System.EventHandler(TextBoxFocusOut);
                }
            }
        }
    

    【讨论】:

      【解决方案2】:

      除了订阅每个 TextBox 的 KeyDown 事件之外,您还有两个我认为更好的选择:

      1. 通过将表单的AcceptButton 属性设置为您希望通过按Enter 键单击的按钮,将您的按钮设置为表单的默认按钮。

      2. 在您的表单上覆盖 ProcessDialogKey 并检查是否按下了 Enter 键:

        protected override bool ProcessDialogKey(Keys keyData)
        {
            if (keyData == Keys.Enter)
            {
                // ... do what you want
                return true;
            }
            else
                return base.ProcessDialogKey(keyData);
        }
        

      【讨论】:

      • 谢谢,这是一个更好的主意!
      【解决方案3】:

      循环遍历所有文本框(包括嵌套),如下所示:Loop through Textboxes

      那么,

      var allTextBoxes = this.GetChildControls<TextBox>();
      
      foreach (TextBox tb in this.GetChildControls<TextBox>())
      {
          tb.Click += ApplyFilterOnEnterKey;
      }
      

      【讨论】:

        【解决方案4】:

        只需使用 Controls 集合并查看控件是否为文本框,然后附加事件

        【讨论】:

          猜你喜欢
          • 2018-11-09
          • 2011-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 2011-01-28
          • 1970-01-01
          • 2015-05-19
          相关资源
          最近更新 更多