2010-10-01 81 views
0

hi form1中的form2呼叫事件?form1中的form2呼叫事件

例如:

下面的代码到窗口2:

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

什么在Form1中写?

回答

0

form2.Form2_Load(this, null)

+0

这是一种私人方法。他不能从课堂外打电话给他。 – Oded 2010-10-01 19:47:30

+0

哎呀...我的错误... – Viv 2010-10-01 19:52:32

2

你为什么想打电话给这个事件?你会知道发件人和事件参数吗?

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

0

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

如果您的form1位于同一装配体中,您可以将可访问性更改为internal,这将使其在装配体内可见。

或者,您可以将其设置为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(); 
+0

这是一个原则性的方式? – 2010-10-01 22:26:32

+0

你是什么意思的“原则方式”? – Oded 2010-10-02 09:27:43

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

当用户按下按钮1发布形式,订阅形式将执行与委托相关联的代码,从而在消息框中与消息http://stackoverflow.com弹出。