如何检测对另一个窗体的方法的调用

本文关键字:窗体 另一个 方法 调用 何检测 检测 | 更新日期: 2023-09-27 18:21:48

我有一个名为myForm的winform应用程序。在这个表单中,我打开另一个表单:

    private OtherForm otherForm; //this is a field
    private OpenOtherForm()
    {
       if (otherForm == null)
       {
          otherForm = new OtherForm();
          otherForm.FormClosing += delegate { MessageBox.Show("OtherForm will be closed"); otherForm = null};
       }
       MessageBox.Show("Form is already active!");
    }

这很好用。但我也有一些第二种形式的方法。我想试着捕捉他们的电话。

例如,如果在第二个表单中调用OtherForm.DoSomething(),我希望有一个消息框来显示thi。

我试图分配OtherForm.DoSomething() += delegate { /* mesagebox */};,但这并不能编译

如何检测对另一个窗体的方法的调用

otherForm.FormClosing += delegate { .. }正在编译,因为FormClosing的类型为Event。可以订阅一个事件,当它被激发时,您的代码将运行。

不能在像DoSomething()这样的方法上使用此语法。方法只能用类似otherForm.DoSomething()的方法调用。然后将执行DoSomething()中的代码。

但是,您可以创建自己的事件,并在以第二种形式执行DoSomething()时激发它

这是关于发布您自己的活动的MSDN文档。

它可能类似于:

public event EventHandler RaiseCustomEvent;
public void DoSomething()
{
    OnRaiseCustomEvent();
}
protected virtual void OnRaiseCustomEvent()
{
    EventHandler handler = RaiseCustomEvent;
    if (handler != null)
    {
         handler(this, EventArgs.Empty););
    }
}

如果您想在另一个表单中响应调用,可以将事件添加到另一个窗体中,并在您试图响应的方法中引发它。

class Form1: Form
{
    public void Button1_Click(object sender, EventArgs e)
    {
        var form2 = new Form2();
        form2.SomeMethodCalled += Form2_SomeMethodCalled;
    }
    public void Form2_SomeMethodCalled(object sender, EventArgs e)
    {
        // method in form2 called
    }
}

class Form2 : Form
{
    public event EventHandler SomeMethodCalled;
    public void SomeMethod()
    {
        OnSomeMethodCalled();
        // .....
    }
    private void OnSomeMethodCalled()
    {
        var s = SomeMethodCalled;
        if(s != null)
        {
            s(this, EventArgs.Empty);
        }
    }
}