winform内のすべてのTextBoxにイベントをバインドする

私は単一のwinformアプリケーションに多くのTextBoxを持っています。私はフォームがロードされるとき、またはそのコンストラクタに単一のイベントメソッドをすべてのテキストボックスにバインドする方法を探しています。そのため、デザイナのすべてのテキストボックスにイベントを追加しないでください。

イベントでは、私は、Enterキーを検出し、プログラムでボタンをクリックしたい:

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

問題は、フォームのすべてのテキストボックスをループして上記のメソッドにバインドする方法です。私のテキストボックスはどこでも、ネストされたテーブルレイアウトパネルまたは入れ子になった通常のパネルの中にあります。どのようにこのループはどのように見えるのでしょうか?フォームコンストラクタまたはロードイベントで!

1

3 答え

すべてのTextBoxのKeyDownイベントを購読するのではなく、もっと良いと思う2つのオプションがあります:

  1. Set your button as the default button of the form by setting AcceptButton property of the form to the button you want to be clicked by pressing Enter key.

  2. Override ProcessDialogKey on your form and check for pressing the Enter key:

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
           //... do what you want
            return true;
        }
        else
            return base.ProcessDialogKey(keyData);
    }
    
1
追加された
ありがとう、これははるかに良いアイデアでした!
追加された 著者 Saeid Yazdani,

Loop through all textboxes (including nested) like this as shown here: Loop through Textboxes

次に、

var allTextBoxes = this.GetChildControls();

foreach (TextBox tb in this.GetChildControls())
{
    tb.Click += ApplyFilterOnEnterKey;
}
1
追加された

Controlsコレクションを使用して、コントロールがテキストボックスであるかどうかを調べて、イベントを追加してください

1
追加された