利用委託 實現窗體間通訊,非原創
阿新 • • 發佈:2018-11-11
copy自:https://www.cnblogs.com/hugoNB/p/7130562.html,這個作者寫的淺顯易懂,就複製下來自己看
實現過程:
這裡主要是用到委託實現,所以主要描述一下委託在這裡的應用。
我們要在主窗體(這裡的子父窗體都是自己假想)中獲取子窗體中的元素,所以首先在主窗體宣告一個委託,這個委託是用來幹嘛的?我們知道,在子窗體勾選幾個選項點選確定之後,在這個事件中,我們需要將勾選的內容傳送到主窗體,這裡的委託的含義就是:我主窗體有給TextBox顯示文字的方法,但是我主窗體幹不了這件事兒,因為我沒有文字,文字在你子窗體那裡,所以主窗體得委託子窗體幹一件事兒,這個事兒就是麻煩你子窗體把勾選的東西的文字給我顯示到主窗體傳的TextBox中。
//1、宣告一個委託 public delegate void showText(List<String> ls);
宣告完委託後,在子窗體(Form2/Form3)例項化一個委託,這個委託才是真真正正的委託,是幹事的委託。
//2、例項化一個委託
public showText f2;
那有了委託之後,你子窗體需要幹什麼事情呢?來,就是幹這件事兒:麻煩你幫我把list集合中的字串顯示到textBox1裡面去。該方法是在主窗體中寫的。
//3、委託的方法,這個方法應該和第一步是同步實現的,這裡暫且記作第3步。
private void T1Show(List<String> ls) { stringList1 = ls; stringList1.Sort(); this.textBox1.Text = null; foreach (String item in stringList1) { this.textBox1.Text += item + ";"; } }
委託子窗體要乾的事情有了,接下來就是把這件事委託給子窗體。
//4、把要乾的事情委託給子窗體已經建立好的委託載體f2.
objForm.f2 = this.T1Show;
到這裡基本上就實現了子父窗體利用委託進行窗體間通訊,先把整個專案的程式碼展示出來:
主窗體程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Collections; namespace 雲狀 { public partial class Form1 : Form { //儲存當前已經新增到資料庫的氣象程式碼 // public List<String> stringList1 = new List<string>(); //private List<String> stringList2 = new List<string>(); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 objForm = new Form2(); objForm.FormBorderStyle = FormBorderStyle.None; //4、把要乾的事情委託給子窗體已經建立好的委託載體f2. objForm.f2 = this.T1Show; objForm.ShowDialog(); } //3、委託的方法,這個方法應該和第一步是同步實現的,這裡暫且記作第3步。 private void T1Show(List<String> ls) { stringList1 = ls; stringList1.Sort(); this.textBox1.Text = null; foreach (String item in stringList1) { this.textBox1.Text += item + ";"; } } private void T2Show(List<String> ls) { stringList2 = ls; stringList2.Sort(); this.textBox2.Text = null; foreach (String item in stringList2) { this.textBox2.Text += item + ";"; } } private void button2_Click(object sender, EventArgs e) { Form3 objForm = new Form3(); objForm.FormBorderStyle = FormBorderStyle.None; objForm.f3 = this.T2Show; objForm.ShowDialog(); } private void button3_Click(object sender, EventArgs e) { //入庫 } } //1、宣告一個委託 public delegate void showText(List<String> ls); }
子窗體Form2程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Collections; namespace 雲狀 { public partial class Form2 : Form { //2、例項化一個委託 public showText f2; public Form2() { InitializeComponent(); if (Form1.stringList1 != null) { foreach (Control item in this.panel1.Controls) { if (item is CheckBox) { string str = ((CheckBox)item).Text.Substring(0, 2); if (Form1.stringList1.Contains(str)) { ((CheckBox)item).Checked = true; } } } } } private void button1_Click(object sender, EventArgs e) { List<String> ls=new List<string>(); foreach(Control item in this.panel1.Controls) { if(item is CheckBox) { if (((CheckBox)item).Checked==true) { ls.Add(((CheckBox)item).Text.Substring(0, 2)); } } } if(f2!=null) { f2(ls); } this.Close(); } private void button2_Click(object sender, EventArgs e) { this.Close(); } } }
子窗體Form3程式碼:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace 雲狀 { public partial class Form3 : Form { public showText f3; public Form3() { InitializeComponent(); if (Form1.stringList2 != null) { foreach (Control item in this.panel1.Controls) { if (item is CheckBox) { string str = ((CheckBox)item).Text.Substring(0, 2); if (Form1.stringList2.Contains(str)) { ((CheckBox)item).Checked = true; } } } } } private void button1_Click(object sender, EventArgs e) { List<String> ls=new List<string>(); foreach (Control item in this.panel1.Controls) { if (item is CheckBox) { if (((CheckBox)item).Checked == true) { ls.Add(((CheckBox)item).Text.Substring(0, 2)); } } } if (f3 != null) { f3(ls); } this.Close(); } private void button2_Click(object sender, EventArgs e) { this.Close(); } } }
可能會有疑問,不就是傳一個List<String>嗎,有必要這麼麻煩嗎?其實這裡只是利用委託做事情,委託的其他用處還很廣泛,我也在學習之中,以後有什麼值得記錄的東西,再在這裡記錄。。。