很多初學者經常遇到的問題,就是窗體之間的傳值。
下面說三種常用的方法:
前提有兩個窗體,一個叫ParentFrm主窗體,一個叫ChildFrm子窗體
兩個窗體上都只有兩個控件,txtMsg的textBox以及btnSendMsg的button
(1)
在ChildFrm中寫一個公共方法,目的是能再ParentFrm中能夠使用這個方法
public void SetMsg(string txt)
{
this.txtMsg.Text = txt;
}
}
然後在ParentFrm中調用它
private void btnSendMsg_Click(object sender, EventArgs e)
{
childFrm.SetMsg(this.txtMsg.Text);
}
當然你需要在load事件中將ChildFrm窗體new出來
(2)
使用委託,達到低耦合的效果
在ChildFrm中寫一個公共方法,目的是能再ParentFrm中能夠使用這個方法
public void SetMsg(string txt)
{
this.txtMsg.Text = txt;
}
}
在ParentFrm中
先定義一個委託
public Action<string> AfterMsgSend { get; set; }
在load事件中註冊
private void PersonFrm_Load(object sender, EventArgs e)
{
ChilderFrm cf = new ChilderFrm();
//childFrm = cf;
//在顯示第二個窗體之前註冊事件
AfterMsgSend += cf.SetMsg;
cf.Show();
}
最後在點擊事件中,調用它
private void btnSendMsg_Click(object sender, EventArgs e)
{
AfterMsgSend(this.txtMsg.Text);
}
(3)
使用事件,其實與委託方法相似
在ChildFrm中寫一個公共方法
public void GetMsg(object sender, string e)
{
this.txtMsg.Text = e;
}
在ParentFrm中
先定義一個事件
public event EventHandler<string> AfterMsgSendEvent;
在load中註冊事件 private void PersonFrm_Load(object sender, EventArgs e)
{
ChilderFrm cf = new ChilderFrm();
//事件註冊
AfterMsgSendEvent += cf.GetMsg;
cf.Show();
}
再點擊事件中調用 private void btnSendMsg_Click(object sender, EventArgs e)
{
//事件傳值
AfterMsgSendEvent(this, this.txtMsg.Text);
}
委託與事件的關係:
1.事件是委託的一個特殊實例
2.當聲明委託變量前加了event關鍵字後,就立刻變成了事件
3.事件只能使用+=或-=來賦值,這樣就避免了將之前註冊的事件覆蓋掉
4.事件只能在類內部觸發執行
委託與事件的區別:
沒有可比性,因爲委託是數據類型,事件時對象,是對委託的一種封裝