窗體間傳值要弄清楚到底是哪個對象的問題,否則容易傳錯值。就比如窗體對象loginFrm爲登陸窗體,想把當前的登陸用戶信息傳遞給主窗體mainFrm,但是卻實例了一個新的對象loginFrm把裏頭的信息傳遞給了mainFrm,所以得到了一空值,頗有刻舟求劍的味道,不同的內存空間就比如湖水的寬廣一樣,存放着不同的對象,彼此要分清楚。窗體傳值的前提是,要傳的字段,在類裏面的訪問修飾符必須是public(如果在源窗體內傳值則例外,參見下列常用方法2)。
常用的方法:
- 1. 靜態變量,在窗體裏Class Form1中,寫入一個靜態變量A,可以給其賦值,那麼在這個項目中,就可以通過Form1.A來調用。不推薦此種方法,不太安全。
- 2. 比較穩妥的方法,就是在傳值的過程中,首先在被傳值窗體form2中,建立一個公有屬性B,做爲接收者。在form1裏實例form2時,把需要傳遞的值A賦給新實例form2.B,或者是通過Form2類的構造函數傳遞,方法很多,此種傳值較爲安全(推薦)。
- 3. 若是要得到一組固定的數據,那麼可以寫成一個公有的帶返回值的方法,在源窗體中。然後在目標窗體中實例源窗體對象,調用此方法獲得數據,此方法雖不同於靜態變量,但有異曲同工之妙,可以不必強調對象。其缺點是,方法體內傳遞數據爲固定的,不能變通。
- 4. 查詢對話框,大家都用過記事本,裏頭有個查詢功能,就是當選中一段文字時,打開查詢對話框,就會在查詢對話框中顯示選中的那段文字,其代碼實現爲:
public string passText
{
get{ return textBox1.Text;}
}
Form1中還有個按鈕button1在其點擊事件中有:
private void button1_Click(object sender,EventArgs e)
{
Form2 f2 = new Form2(); //呃。。這個就不用說了
f2.Owner = this; //設置附屬,好搭關係~
f2.Show(); //看得出來撒
}
在Form2的對象中:
假設有個文本框txtBox1,現
private void form2_Load(object sender,EventArgs e)
{
//通過目標窗體,找到擁有它的源窗體,得到的是一個object
對象,要轉換成Form1這個類型,就可以得到它的公有屬性passText拉。
textBox1.Text = ((Form1)this.Owner).passText;
}
這樣當我們打開Form2時,就會在其文本框中,顯示Form1的文本框信息了(想要做到查詢對話框顯示選中文本的效果,只需要在把passText 的屬性改成textBox.SelectedText即可.)
這種方法的主要好處是在於,我們能在目標窗體的對象中,找到源窗體的對象。而有別與上面兩種情況。
- 5. 窗體間同步傳值的實現,就是實時更新兩個窗體間的信息,有心的朋友可能發現,既然能在目標窗體中,找到源窗體,那麼我們還可以通過源窗體來控制目標窗體,從這裏面突破,就能達到此效果了。代碼如下還是依照4例:在Form1中:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public string passText
{
get {
return textBox1.SelectedText.Text;
}
}
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Owner = this;
f2.Show();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
if(this.OwnedForms.Length != 0)
(this.OwnedForms[0] as Form2).selectText = textBox1.Text;/*OwnedForms是一個數組 ,表示當前對象擁有的子窗體數組,同樣要把通過下標得到的元素轉換爲Form2類型。*/
}
}
}
namespace WindowsApplication1
{
public partial class Form2 : Form
{
public string selectText
{
set
{
textBox1.Text = value; //設置一個屬性,讓form1操作
}
}
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
textBox1.Text = ((Form1)this.Owner).passText;
}
}
}
- 6.通過委託事件來實現子窗體向父窗體傳值
在Form1中寫入代碼: Form2 form= new Form2 (); form.SendEvent += new Form2 .SendMessage(GetMessage); form.Show(); /// <summary> /// 代理調用的方法 /// </summary> /// <param name="str">Form2傳過來的值</param> public void GetMessage(string str) { //在這裏處理Form2傳過來的值str } 在Form2窗體中寫入代碼: //代理聲明 public delegate void SendMessage(string str); //事件聲明 public event SendMessage SendEvent; //調用事件(message爲你所要傳遞的值) SendEvent(message); 如果是2個毫無相關的頁面之間的傳值可以用靜態類來實現!
最後,要說一下的是,在傳值的時候,不光可以傳變量屬性,還有個很好的東西,每個窗體都有個Tag屬性,是一個標記,object類型的,我們可以把一個類賦給它。這樣就爲我們的代碼,提供了極大的便利,大家可以依據上面幾種傳值方式,進行使用。