C# 从form1中的form2调用事件

C# 从form1中的form2调用事件,c#,winforms,events,C#,Winforms,Events,嗨 从form1中的form2调用事件 例如: 将以下代码转换为form2: private void Form2_Load(object sender, EventArgs e) { MessageBox.Show("http://stackoverflow.com"); } 在form1中写入什么?form2怎么样?form2\u加载(此为空)为什么要调用该事件?您知道发件人和事件参数吗 为什么不在Form2中创建一个Form1可以看到的公共方法呢?

嗨 从form1中的form2调用事件

例如:

将以下代码转换为form2:

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

在form1中写入什么?

form2怎么样?form2\u加载(此为空)为什么要调用该事件?您知道发件人和事件参数吗


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

不能从类外部调用类的私有成员

您可以将可访问性更改为
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();

你不能在课外发起活动。 约定是在类中调用
OnEventname
方法。通常此方法是受保护的(不能仅从类本身或从其继承的其他类访问)

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

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";
}
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;
    }
}
订阅表单如下所示:

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;
    }
}
公共部分类订阅者:表单 { 公共用户() { 初始化组件(); }

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

当用户按下发布表单上的按钮1时,订阅表单将执行与委托相关联的代码,导致弹出一个消息框,其中包含消息
http://stackoverflow.com

这是一个私有方法。他不能在课外调用它。你所说的“有原则的方法”是什么意思?