2010-10-01 83 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彈出。