用户填写表单“f”后,表单将保留一个我要在运行doStuff()之前检查的值。比如,如果f.value> 0,然后运行doStuff(),否则,不要运行doStuff()。我怎样才能最简洁地修改我的代码以允许进行此项检查?我不太明白分配委托的时间,如果我传递f.value,它会在我添加委托时,或者当它运行委托时取值吗?
form f = new form();
f.Show();
f.FormClosing += delegate{doStuff();};
谢谢!
答案 0 :(得分:6)
您可以在创建委托时捕获引用的值:
f.FormClosing += delegate { if(f.value > 0) doStuff(); };
当事件发生时,它将检查捕获的引用f
的当前值,如果条件匹配,则继续执行。
答案 1 :(得分:1)
form f = new form();
f.Show();
f.FormClosing += delegate{if(f.Value>0){doStuff();}};
我相信它会在运行时使用值,而不是在分配时使用。因此,当FormClosing事件触发时,它将使用f.Value的值
答案 2 :(得分:1)
这样的东西?
form f = new Form();
f.Show();
f.FormClosing += (s, a) =>
{
if (f.Value > 0)
{
doStuff();
}
};
答案 3 :(得分:1)
我的理解是lambdas在他们定义的范围内运行,所以......
form f = new form();
f.Show();
f.FormClosing += delegate
{
if(f.Value > 0)
doStuff();
};
答案 4 :(得分:1)
我不会这样做。我让表单处理这一切。只需运行表单......
public void showMyForm()
{
form f = new form();
f.Show();
}
...然后在.cs文件格式中定义表单结束事件,并在表单中链接事件......
public partial class form : Form
{
//Link the event in the IDE and let InitializeComponent() add it. Then perform the
//the things you want in the form itself based on your condition
private void doStuff(object sender, FormClosingEventArgs e) //Think that's the right args
{
if (this.value > 0)
{
//code you want to execute.
}
}
}
答案 5 :(得分:1)
您可以使用常规语法来实现它
form f = new form();
f.FormClosing += FormClosingHandler; // Add unanonaymous delegate to the event handler
f.Show();
private void FormClosingHandler(object sender, FormClosingEventArgs e)
{
var form = (form)sender;
form.FormClosing -= FormClosingHandler; // Unsubscribe from the event to prevent memory leak
if(form.value > 0)
{
doStuff();
}
}
答案 6 :(得分:0)
如果f.Value是表单的成员,则会在委托运行时检查它,并且您将获得当时分配的值,而不是在您指定委托时的那一刻。