情境:C#,. NET 3.5,WinForms
目标:Form1有一个可以通过构造函数启用的Button。 I.E.只有在我调用新Form1(true)时才会显示该按钮。
我们希望能够通过一些param从Form2传递给Form1(不必在Form1的构造函数上),并且当按下Form1.Button1时,应该执行Form2.<SomeMethod>
。
我们知道我们可以在Form1中创建一个Delegate / Event,并从Form2创建一个类似的东西:
Form1.SomeDelegate += new ..... (MyMethodInForm2);
...然后在Form1_ButtonClick中我们触发事件,而事件又将在Form2中完成魔术。
但我们想知道是否有更优雅/新/现代版本(匿名方法?Lambda表达式等等)来实现这一目标。
这个想法是“任何”形式可以实现Form1类并传递自己的方法,以便在单击Form1的按钮时执行;但是,Form1不是回调调用者(form2,3,.. n),而是执行传递的函数(可能位于调用者内部)。我们现在真的不需要这些函数来获取参数。
注意:代码示例包含简单的变量/对象名称,不能从现实生活中获取,请忽略简单性。
更新很抱歉没有更具体,我认为我将继续使用代表/事件模型,但作为参考,我认为这是对情况的更好描述:
Form1是一个通用表单,它接受一个项目列表并显示它们。我们可以传递员工类型或人员类型或任何“T”。它工作正常。 我们收到了客户的要求,询问是否可以向该小Form1添加一个可选按钮,如果点击它,它将打开另一个表单/执行一些方法。
这样,如果我使用Form1,我可以-at运行时 - 告诉按钮打开EmployeeForm,而如果我使用Form1,那么相同的按钮可以打开PersonForm形式。现在打开一个表单不是我们对该按钮的唯一用途,但这是调用者的问题。
现在,我所做的就是我们所说的:在Form1上委托/事件,在“调用”表单上我们做一个Form1.theEvent + = stuff,来订阅这个事件。我只是想知道是否有更好的方法来实现这一点,因为这是我们在.NET 2.0中的方式,我们刚刚开始使用.NET 3.5。
答案 0 :(得分:1)
不完全确定您对表单内容的含义,但您可以发送一个Func。例如:
public class MyForm<T>
{
private readonly Func<T, bool> predicate;
public MyForm(Func<T, bool> predicate) { this.predicate = predicate }
private void SomeMethod()
{
bool result = predicate();
// Do something
}
}
var form = new MyForm(x => x.Number < 5);
答案 1 :(得分:1)
听起来你两次都在描述同样的事情。
订阅事件就是这样 - 将一个函数传递给Form1,然后在事件被引发时执行该函数。
如果需要,您可以使用lambda表达式订阅该事件,但您不必这样做。
当然,如果您愿意,可以将委托作为Form1
构造函数参数,但在这种情况下我没有看到这样做的好处。
简而言之:我认为正常活动可以满足您的一切需求。如果您要求不处理哪些事件,请提供更多信息。
答案 2 :(得分:0)
第一:你应该在Form1中声明一个公共事件 第二:你应该调用发送到Form1的事件,比如Button1_Click
答案 3 :(得分:0)
据我所知,Form2是Form1可以更新的非模态对话框。但是,Form2可能尚未创建。
完成Form2更新的显而易见的方法就是使用事件模型,使用Composition并将Form1传递给它的构造函数。
您可以使用委托并存储但我无法看到如何将引用传递给父表单。
如果您希望Form2更新任何类型,那么一个简单的界面就可以解决问题。
答案 4 :(得分:0)
另一种方法是通过在通用表单上定义“代理事件”来公开按钮的Click事件:
public class MyForm<T> : Form
{
public event EventHandler MyClick
{
add { this.theButton.Click += value; }
remove { this.theButton.Click -= value; }
}
// ...
}