如何只处理一次Textbox离开事件

时间:2011-01-14 07:08:01

标签: c# winforms

如果用户输入的值大于零,我编写了一个打开表单的代码,如下所示

 private void txtNoOfAddenda_Leave(object sender, EventArgs e)
    {
       string traceNo = string.Empty;
        int i = 0;
        if (!int.TryParse(txtNoOfAddenda.Text, out i))
        {
            MessageBox.Show("Enter numeric value betewwn(0-9999)");
            txtNoOfAddenda.Focus();
        }
        else
        {
            if (i > 0)
            {
                traceNo = txtTraceNo.Text.Substring(8, 7);
                frmAddenda frmAddenda = new frmAddenda(i, traceNo);
                frmAddenda.ShowDialog();
            }
        }
    }

这样可以正常工作,但是如果我移回我的标签,如果文本框再次离开相同的代码执行,我只需要这一次被解雇,任何人都可以给我一个想法..

5 个答案:

答案 0 :(得分:7)

如果确实希望事件处理程序只触发一次,只需取消订阅处理程序中的事件:

txtNoOfAddenda.Leave -= txtNoOfAddenda_Leave;

我猜你只想在显示新表单的代码中使用此代码 - 如果你显示消息框则不行。

您真的希望用户只能显示一次新表单吗?如果他们关闭那个表格然后回到带有文本框的那个表格怎么办?如果没有办法再显示另一种形式,例如如果他们改变了价值?

答案 1 :(得分:3)

在您的方法中,添加以下行:

txtNoOfAddenda.Leave -= txtNoOfAddenda_Leave;

这将取消注册事件处理程序,并确保稍后不会再次调用它。

答案 2 :(得分:1)

您可以保留一个实例变量:

private bool eventRan = false;
private void txtNoOfAddenda_Leave(object sender, EventArgs e)
{
    if(eventRan) return;
    eventRan  = true;
    ....

答案 3 :(得分:0)

在事件处理程序方法之外定义表单变量,并在方法内检查表单之前是否已实例化。您还可以运行检查以查看表单是否已打开。

private frmAddenda _frmAddenda

private void txtNoOfAddenda_Leave(object sender, EventArgs e)
{
  ...
  else
  {
    if (i > 0 && _frmAddeda == null)
    {
      traceNo = txtTraceNo.Text.Substring(8, 7);
      frmAddenda frmAddenda = new frmAddenda(i, traceNo);
      frmAddenda.ShowDialog();
    }
  }
}

答案 4 :(得分:0)

我刚刚遇到这个问题并通过将我的代码移出Leave事件并进入Validated事件来解决它。