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);
    } 
}

然后连接离开事件

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 回答