如果用户输入的值大于零,我编写了一个打开表单的代码,如下所示
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();
}
}
}
这样可以正常工作,但是如果我移回我的标签,如果文本框再次离开相同的代码执行,我只需要这一次被解雇,任何人都可以给我一个想法..
答案 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事件来解决它。