hi form1中的form2呼叫事件?form1中的form2呼叫事件
例如:
下面的代碼到窗口2:
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show("http://stackoverflow.com");
}
什麼在Form1中寫?
hi form1中的form2呼叫事件?form1中的form2呼叫事件
例如:
下面的代碼到窗口2:
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show("http://stackoverflow.com");
}
什麼在Form1中寫?
form2.Form2_Load(this, null)
你爲什麼想打電話給這個事件?你會知道發件人和事件參數嗎?
爲什麼不在Form1中創建Form1能夠看到的公共方法?
您無法從外部調用某個班級的私人成員。
如果您的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();
這是一個原則性的方式? – 2010-10-01 22:26:32
你是什麼意思的「原則方式」? – Oded 2010-10-02 09:27:43
您不能從課外舉辦活動。 約定是你在類中調用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";
}
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
彈出。
這是一種私人方法。他不能從課堂外打電話給他。 – Oded 2010-10-01 19:47:30
哎呀...我的錯誤... – Viv 2010-10-01 19:52:32