C#窗體間通信的幾種經常使用處置辦法總結。本站提示廣大學習愛好者:(C#窗體間通信的幾種經常使用處置辦法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C#窗體間通信的幾種經常使用處置辦法總結正文
在停止C#運用法式開辟的進程中,常常須要多窗體之間停止數據通訊,本文舉幾個例子,把幾種經常使用的通訊方法總結一下,窗體界面以下圖所示:
主窗體Form1是一個ListBox,單擊選中某列時,彈出窗體Form2,Form2中兩個控件,一個是TextBox,顯示選中的該列的文本,另外一個是按鈕,點擊時將修正後的值回傳,且在Form1中修正響應的列的文本,同時Form2封閉。
辦法一:傳值
最早想到的,Form2結構函數中吸收一個string類型參數,即Form1當選中行的文本,將Form2的TextBox控件的Text設置為該string,即完成了Form1向Form2的傳值。當Form2的AcceptChange按鈕按下,須要修正Form1中ListBox中響應列的值,是以可以斟酌同時將Form1中的ListBox控件當參數也傳入Form2,一切修正任務都在Form2中完成,依據這個思緒,Form2代碼以下:
publicpartial class Form2 : Form { private string text; private ListBox lb; private int index; //結構函數吸收三個參數:選中行文本,ListBox控件,選中行索引 public Form2(string text,ListBox lb,int index) { this.text = text; this.lb = lb; this.index = index; InitializeComponent(); this.textBox1.Text = text; } private void btnChange_Click(object sender, EventArgs e) { string text = this.textBox1.Text; this.lb.Items.RemoveAt(index); this.lb.Items.Insert(index, text); this.Close(); } }
Form1中new窗體2時這麼寫:
public partial class Form1 :Form { int index = 0; string text = null; public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgse) { if (this.listBox1.SelectedItem != null) { text = this.listBox1.SelectedItem.ToString(); index = this.listBox1.SelectedIndex; //結構Form2同時傳遞參數 Form2 form2 = new Form2(text, listBox1, index); form2.ShowDialog(); } } }
OK,辦法一的處理辦法就是如許,利益是直不雅,須要甚麼就傳甚麼,缺陷也是不言而喻的,假如窗體1中須要修正的是一百個控件,豈非結構的時刻還傳100個參數出來?何況假如其他窗體依然須要彈Form2,那Form2就廢了,只能供窗體1應用,除非寫重載的結構函數,晦氣於代碼的復用,持續看下一個辦法。
辦法二:繼續
這個辦法我試了許多次,繼續切實其實可以做,然則費事不說,還不便利,是以小我以為假如為了相互操作數據而應用繼續,是不適合的,但既然是個辦法,就扔出來看看,現實感化≈0。
Form2窗體:
//聲明Form2繼續於Form1 public partial classForm2 : Form1 { publicint index; public ListBox lb; public Form2(string text) { //將繼續過去的listBox設置為弗成見 this.listBox1.Visible=false; InitializeComponent(); this.textBox1.Text = text; } private void btnChange_Click(object sender, EventArgs e) { string text = this.textBox1.Text; this.lb.Items.RemoveAt(index); this.lb.Items.Insert(index,text); this.Close(); } }
Form1窗體:
public partial class Form1 :Form { public int index = 0; public string text = null; public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgse) { if (this.listBox1.SelectedItem != null) { text = this.listBox1.SelectedItem.ToString(); index = this.listBox1.SelectedIndex; Form2 form2 = new Form2(text); //結構完Form2後,為Form2中各參數賦值 form2.lb =this.listBox1; form2.index = index; form2.Show(); } } }
這裡有幾點成績須要留意,Form2中各屬性須要哪一種賦值辦法?從Java過度來的都曉得,Java繼續中在子類中應用症結字super可以拜訪基類中私有的辦法及參數,而C#中super換成了base,那是否是意味著我們可以在Form2中這麼為參數賦值呢?
this.lb=base.listBox1; this.index=base.index;
OK,第二種寫法沒成績,可以保留index值,然則對ListBox控件,這麼賦值就會出成績,經由過程測試我發明,base.listBox1指向的,是子類繼續過去的listBox1對象,其實不是基類本身的listBox1對象。是以我們猜想,那base.index值是否是也是指向子類的index呢?測試一下發明切實其實是如許,是以this.index=base.index等於沒寫,去失落照樣可以用,由於index一樣被Form2繼續過去了,是以我們可以懂得到,C#中的窗體繼續,經由過程base.控件是沒法操作基類控件的。
辦法三:事宜回調
既然C#有事宜這個器械,為啥不消呢,並且事宜在窗體通訊方面,有著更加便利的感化,我們曉得事宜現實上就是狀況的捕捉,在最初我會舉一個捕捉狀況的例子,先看數據相互操作的例子。
Form2窗體:
//界說一個須要string類型參數的拜托 publicdelegate void MyDelegate(string text); public partial class Form2 :Form1 { //界說該拜托的事宜 public event MyDelegate MyEvent; public Form2(string text) { InitializeComponent(); this.textBox1.Text = text; } private void btnChange_Click(object sender, EventArgs e) { //觸發事宜,並將修正後的文本回傳 MyEvent(this.textBox1.Text); this.Close(); } }
Form1窗體:
public partial class Form1 :Form { public int index = 0; public string text = null; public Form1() { InitializeComponent(); } private void listBox1_SelectedIndexChanged(object sender, EventArgse) { if (this.listBox1.SelectedItem != null) { text = this.listBox1.SelectedItem.ToString(); index = this.listBox1.SelectedIndex; Form2 form2 = new Form2(text); //注冊form2_MyEvent辦法的MyEvent事宜 form2.MyEvent += new MyDelegate(form2_MyEvent); form2.Show(); } } //處置 void form2_MyEvent(string text) { this.listBox1.Items.RemoveAt(index); this.listBox1.Items.Insert(index, text); } }
可以看出,應用事宜確切是很便利的,而且不須要傳遞那末多參數,不須要有繼續關系,且進步了代碼重用,是以在普通的需求下,建議這麼應用。