C#Winforms:将函数从一种形式传递给另一种形式?

时间:2009-10-01 10:17:55

标签: c# .net delegates

情境: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。

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

    // ...
}