3

フォームにいくつかのコントロールがあり、(デザイナーを介して) 関数を Leave イベントに割り当てました。次のようなものです。

textBox1.Leave += new System.EventHandler(f1);
textBox2.Leave += new System.EventHandler(f2);
textBox3.Leave += new System.EventHandler(f3);

これらの関数は、テキスト ボックスに対していくつかの検証を実行します。すべてのテキスト ボックスが同じデリゲートを呼び出すわけではないことに注意してください。

私が今必要としているのは、私が望むときに「ねえ、Leave イベントを起動してください」と彼らに伝えることができることです。私の場合、この関数を最初のどこかで呼び出します。

private void validateTextBoxes()
{
    foreach (Control c in c.Controls)
    {
        TextBox tb = c as TextBox;
        if (tb != null)
        {
            // Fire the tb.Leave event to check values
        }
    }
}

したがって、すべてのテキストボックスは独自のコードで検証されます。

4

2 に答える 2

5

Leaveイベントと同じ方法でテキストボックスを検証したいだけで、Leaveイベントを実際に発生させたくないと思います.なぜ同じ検証方法で両方を実行しないのですか..

private void ValidateTextBox(TextBox textBox)
{
    //Validate your textbox here..
}

private void TextBox_Leave(object sender,EventArgs e)
{
    var textbox = sender as TextBox;
    if (textbox !=null)
    {
        ValidateTextBox(textbox);
    } 
}

次に、Leave イベントを接続します

textBox1.Leave += new System.EventHandler(TextBox_Leave);
textBox2.Leave += new System.EventHandler(TextBox_Leave);
textBox3.Leave += new System.EventHandler(TextBox_Leave);

次に、最初の検証コード。

private void validateTextBoxes()
{
    foreach (Control c in c.Controls)
    {
        TextBox tb = c as TextBox;
        if (tb != null)
        {
            // No need to fire leave event 
            //just call ValidateTextBox with our textbox
            ValidateTextBox(tb);
        }
    }
}
于 2013-01-31T11:59:45.150 に答える
3

現在のアプローチの代替として、代わりにValidatingイベントを使用することを検討することをお勧めします。これはまさにこの種のもののためのものです。

Validatingを使用する場合は、ContainerControl.ValidateChildren()を使用して、すべての子コントロールの検証ロジックを実行できます。Form クラスが ValidateChildren() を実装していることに注意してください。

個人的には、それがあなたがすべきことだと思います。

于 2013-01-31T12:02:15.680 に答える