程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#窗體間通信的幾種經常使用處置辦法總結

C#窗體間通信的幾種經常使用處置辦法總結

編輯:C#入門知識

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); 
    } 
}

可以看出,應用事宜確切是很便利的,而且不須要傳遞那末多參數,不須要有繼續關系,且進步了代碼重用,是以在普通的需求下,建議這麼應用。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved