从form1中的form2调用事件

时间:2010-10-01 19:42:14

标签: c# winforms events

喜 从form1中的form2调用事件?

例如:

将以下代码转换为form2:

    private void Form2_Load(object sender, EventArgs e)
    {
        MessageBox.Show("http://stackoverflow.com");
    }

在form1中写什么?

5 个答案:

答案 0 :(得分:2)

你为什么要打电话给这个活动?你知道发件人和事件Args吗?

为什么不在Form2中创建一个Form1能够看到的公共方法?

答案 1 :(得分:0)

form2.Form2_Load(this, null)

怎么样?

答案 2 :(得分:0)

您无法从外部调用班级的私人成员。

如果internal位于同一个程序集中,您可以将辅助功能更改为form1,这将使其在程序集中可见。

或者,您可以将其设为public方法,以便全局访问。

但是,您不应该以这种方式调用事件处理程序 - 它们应该处理声明类引发的事件。

对于您提供的示例代码,更好的解决方案是创建可以从此事件处理程序调用的公共或内部方法:

private void Form2_Load(object sender, EventArgs e)
{
    MyMethod();
}

public MyMethod()
{
    MessageBox.Show("http://stackoverflow.com");
}

要从form1调用此方法,需要了解form2

 // in form1
 Form frm2 = new Form2();
 frm2.MyMethod();

答案 3 :(得分:0)

你不能从课外提出一个事件。 惯例是您在类中调用OnEventname方法。通常这种方法受到保护(不仅可以从类本身或从其继承的其他方法访问)

// in form1
private void Method1()
{
    using (var form2 = new Form2())
    {
        form2.Show();

        form2.RaiseLoadEvent(EventArgs.Empty);
    }
}

// Create this method in form2
public void RaiseLoadEvent(EventArgs e)
{
    OnLoad(this, e);
}


// The OnLoad method already exists in form 2 
// But it usually looks like this
protected void OnLoad(EventArgs e)
{
    var eh = LoadEventHandler;
    if (eh != null) 
    {
       eh(this, e); 
    }
}

但是我不建议引发LoadEvent,因为它只是在创建表单后才引发一次。更常见的是对Load事件做出反应以修改表单。

privat void Method1()
{
    using (var form2 = new Form2())
    {
        // Add Event Handler
        form2.Load += new EventHandler(form2_Load);
        form2.ShowDialog();
    }
    // Allways remove Event Handler to avoid memory leaks
    form2.Load -= new EventHandler(form2_Load);
} 

private void form2_Load(object sender, EventArgs e)
{
    form2.Text = "Hello from form1";
}

答案 4 :(得分:0)

Form1(事件发布者)应该为Form2(订阅者)公开一个单独的公共事件属性来订阅。

例如:发布事件的表单如下所示:

public partial class Publisher : Form
{
    public event PostUpdateHandler OnPostUpdate;

    public Publisher()
    {
        InitializeComponent();

        new Subscriber(this).Show();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (OnPostUpdate != null)
        {
            OnPostUpdate(new PostUpdateArgs(textBox1.Text));
        }
    }
}

public delegate void PostUpdateHandler(PostUpdateArgs args);
public class PostUpdateArgs : EventArgs
{
    public string UpdateText;

    public PostUpdateArgs(string s)
    {
        UpdateText = s;
    }
}

订阅表单如下所示:

公共部分类订阅者:表单     {         公共订户()         {             的InitializeComponent();         }

    public Subscriber(Publisher publisher) : this()
    {
        publisher.OnPostUpdate += new PostUpdateHandler(publisher_OnPostUpdate);
    }

    private void publisher_OnPostUpdate(PostUpdateArgs args)
    {
        this.Form2_Load(null, null);
    }

    private void Subscriber_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.Dispose();
    }

    private void Form2_Load(object sender, EventArgs e)
    {
        MessageBox.Show("http://stackoverflow.com");
    }
}

当用户按下发布表单上的button1时,订阅表单将执行与委托关联的代码,从而弹出一个消息框,其中显示消息http://stackoverflow.com