C#跨窗體傳遞值


在我們實際的項目工程中,窗體之間往往需要數據的傳遞,本次通過學習網友發的帖子,了解了值傳遞的方法,現寫下來。

窗體之間值的傳遞方式有很多種,本文只講三種:控件屬性訪問、普通委托事件訪問、泛型委托Action訪問

第一種:

首先新建一個winform窗體form1,再添加一個窗體form2,在窗體1添加一個textbox1和button1,在窗體2添加一個textbox2和button2。如圖

     

在窗體2中添加如下代碼:

 1  public partial class Form2 : Form
 2     {
 3         public Form2()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8 
 9         /// <summary>
10         /// 將外部不可訪問的textbox4.Text封裝成屬性TextBox2Value
11         /// </summary>
12         public string TextBox2Value
13         {
14             set { textBox4.Text = value; }
15             get { return textBox4.Text; }
16         }
17         private void button1_Click(object sender, EventArgs e)
18         {
19             this.DialogResult = DialogResult.OK;//這里的DialogResult是form2類對象的屬性
20         }
21     }
View Code

在窗體1中添加如下代碼:

 1  public partial class Form1 : Form
 2     {
 3         public Form1()
 4         {
 5             InitializeComponent();
 6         }
 7 
 8         private void button2_Click(object sender, EventArgs e)
 9         {
10             Form2 f2 = new Form2();
11             f2.TextBox2Value = textBox5.Text;//把父窗體的值先傳給子窗體
12 
13             if (f2.ShowDialog()==DialogResult.OK)
14             {
15                 textBox5.Text = f2.TextBox2Value;
16             }
17 
18         }
19 
20 
21     }
22 }
View Code

這種可以實現子窗體和父窗體的相互傳值。

第二種:委托事件傳值

1.在窗體2中命名空間下先定義一個委托:public delegate void ChangeHandleText(string str);//帶參數

2.定義一個事件:public event ChangeHandleText changetext;//定義事件

3.將事件與委托關聯起來:Form2 f=new Form2();  f.changetext+=new ChangeHandleText(Change_text);//關鍵

form2代碼:

  
    public delegate void ChangeHandleText(string str);//定義委托
    public partial class Form2 : Form
    {
        
        public event ChangeHandleText changetext; //定義事件
        
       
        public Form2()
        {
            InitializeComponent();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (changetext!=null)//判斷事件是否為空
            {
                changetext(textBox2.Text);//執行委托實例 
            }


        }


    }
View Code

form1代碼

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form2 f = new Form2();
            f.changetext += new ChangeHandleText(Change_text);
            f.Show();  
        }

 

        public void Change_text(string str)
        {
            textBox1.Text = str;
        }


    }
View Code

第三種:泛型委托和Lambda表達式結合

簡單介紹下Lambda表達式:“Lambda表達式”是一種匿名函數,是一種高效的類似於函數式編程的表達式,Lambda簡化了開發中需要編寫的代碼量。它可以包含表達式和語句,並且可用於創建委托或表達式目錄樹類型,支持帶有可綁定到委托或表達式樹的輸入參數的內聯表達式。所有Lambda表達式都使用Lambda運算符=>,該運算符讀作“goes to”。Lambda運算符的左邊是輸入參數(如果有),右邊是表達式或語句塊。Lambda表達式x=>x*x讀作“x goes  to x times x”。可以將此表達式分配給委托類型。如下圖

delegate int del(int i);
static void Main(string[] args)
{
    del myDelegate = x => x * x;
    int j = myDelegate(5); //j = 25
}
View Code

言歸正傳。

窗體2代碼

public partial class Form2 : Form
31     {
32         public Form2()
33         {
34             InitializeComponent();
35         }
36 
37         public Action<string> ChangeText;//之前的定義委托和定義事件由這一句話代替
38 
39         private void button2_Click(object sender, EventArgs e)
40         {
41             if (ChangeText != null)//判斷事件是否為空
42             {
43                 ChangeText(textBox2.Text);//執行委托實例  
44                 this.Close();
45             }           
46         }    
47     }
View Code

窗體1代碼

public partial class Form1 : Form
 8     {
 9         public Form1()
10         {
11             InitializeComponent();
12         }
13 
14         private void button1_Click(object sender, EventArgs e)
15         {
16             Form2 f2 = new Form2();
17             f2.ChangeText = (str) => textBox1.Text = str;//用lambda表達式實現,這句話必須放在f2.ShowDialog();前面
18             f2.ShowDialog();            
19         }
20     }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM