文章出處
文章列表
需求
- 主窗體的文本框內容發生改變的時候,多個子窗體的文本框也發生改變。
中介設計模式
實現
- 當主窗體的文本框內容發生改變的時候,通過接口向所有實現這個接口的窗體發送一條消息(執行接口中的方法),從而實現同步。
主窗體代碼:
public partial class parentFrm : Form
{
private List<IMessage> list = new List<IMessage>();
public parentFrm()
{
InitializeComponent();
}
public void setText(string text)
{
this.tb.Text = text;
}
private void button1_Click(object sender, EventArgs e)
{
ChildFrm1 frm = new ChildFrm1();
list.Add(frm);
frm.Show();
ChildFrm2 frm2 = new ChildFrm2();
list.Add(frm2);
frm2.Show();
ChildFrm3 frm3 = new ChildFrm3();
list.Add(frm3);
frm3.Show();
}
private void tb_TextChanged(object sender, EventArgs e)
{
foreach (IMessage Msg in list)
{
Msg.onMessage(this.tb.Text);
}
}
}
子窗體(由于子窗體基本上一樣,在這里就只寫一個)
public partial class ChildFrm1 : Form,IMessage
{
public ChildFrm1()
{
InitializeComponent();
}
public void onMessage(string str)
{
this.textBox1.Text = str;
}
}
接口
interface IMessage
{
void onMessage(string str);
}
- 主窗體將所有需要同步文本內容的子窗體都添加到一個IMessage集合中,然后當主窗體的文本框中內容發生改變的時候,遍歷這個集合,執行onMessage()方法,修改子窗體文本框中的內容。
- IMessage這個接口就是一個中介。
委托設計模式
實現:
- 創建一個接口,接口里面寫一個設置文本框內容的方法,然后讓子窗體實現這個接口,在主窗體中聲明一個委托,這個委托用來裝接口中的這個方法,然后實例化這個委托,子窗體創建的時候,把所有子窗體中實現的接口中的方法給委托實例,然后在主文本框發生改變的這個方法中執行這個委托。
代碼
主窗體
public delegate void delSendMessage(string str); public partial class Form1 : Form { //事件 public event delSendMessage sendMessageEvent; public delSendMessage sendMessage { get; set; } public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { ChildFrm1 frm1 = new ChildFrm1(); //this.sendMessageEvent += frm1.setText; this.sendMessage += frm1.setText; frm1.Show(); ChildFrm2 frm2 = new ChildFrm2(); //this.sendMessageEvent += frm2.setText; this.sendMessage += frm2.setText; frm2.Show(); ChildFrm3 frm3 = new ChildFrm3(); //this.sendMessageEvent += frm3.setText; this.sendMessage += frm3.setText; frm3.Show(); } private void textBox1_TextChanged(object sender, EventArgs e) { sendMessage.Invoke(this.textBox1.Text); //sendMessageEvent(this.textBox1.Text); } }
子窗體
public partial class ChildFrm2 : Form,ISetText { public ChildFrm2() { InitializeComponent(); } public void setText(string str) { this.textBox1.Text = str; } }
注釋掉的部分就是用事件實現,代碼和委托差不多,區別在于事件更安全,因為事件只能在本類內部調用,而委托可以在其他類中調用。
文章列表
全站熱搜