在一個項目中,很多時候都需要在窗體間進行數據傳遞和通信,最覺見的是父子窗體之間的數據傳遞,比如登錄ID,各個窗體都需要知道。有很多文章都寫了這方面的問題,提出很多優秀的方法,鄙人不才,搜了一些資料之后,准備獻丑了。
1. 如果很多窗體都需要用到某一窗體的東西,比如登錄窗體記錄的ID,為了避免每個窗體都去查詢數據庫,可以把這些公共變量或信息寫入配置文件,每個窗體去讀配置文件即可。
2. 如果共享信息的窗體不多,則對於兄弟窗口,可以通過其共同的父窗體來傳遞數據,此時父窗體如果是容器,只需要在本窗口中定義一個指向父窗體的變量即可,當然不需要new的。
如:父窗體form1兩個子窗體subform1 subform2,均在由父窗體通過new得到,且均定義為全局公共變量,即在所有成員函數外定義為public。我們希望把子窗體1即subform1中textbox的內容傳遞到子窗體2即subform2的textbox中,可以這樣做:
先設父窗體的屬性mdicontainer=true。 在subform2中:Form1 parentform=(Form1)this.mdiparent; 此時,在subform2中便可以通過:this.textbox.text=parentfrom.subform1.textbox.text ,將subform1 中textbox的值賦給了subform2的textbox。 同理,也可以在subform2中直接修改subform1.textbox的值:parentfrom.subform1.textbox.text=”XXXX”。當然這樣做的前提是這些控件如textbox都必須聲明成public。
3. 父子窗體間傳遞數據。form1是父窗體,form2是子窗體,form2由form1直接new得到,兩窗體中均含有public型的textbox1。父窗體向子窗體傳遞數據是相當容易的,只需把子窗體中的控件或變量聲明為public,直接在窗體中修改即可。但子窗體向父窗體傳遞數據就沒那么簡單了。當然我們可以采用上述的第二種方法,不過此時父窗體是容器,如果里面還要放其它控件,必須用panel裝起來。如果不想父窗體成為容器,可以通過把父窗體通過子窗體的構造函數傳遞給子窗體,子窗體中有一個變量指向窗體即可。子窗體構造函數:
public Form1 frm1; public Form2(Form1 frm1) { InitializeComponent(); this.frm1 = frm1; }
在父窗體中new子窗體:Form2 frm2 = new Form2(this);之后就可以隨便修改子窗體中聲明為public的變量或控件了,如frm2.textBox1.Text=”good”;。通過子窗體的構造函數我們可以看到,子窗體有一個變量指向父窗體,相當於一個指針。這樣在子窗體中可以直接訪問父窗體: this.frm1.textBox1.Text ="good";我們返回去看發現父窗體的textbox1.text確實變成了good。如果在窗體中將frm2定義為public型,那么就可以循環訪問了。如this.frm1.frm2.frm1.frm2.frm1.frm2….無窮下去。所以盡量避免將其定義為全局public型,同時不要寫出上述循環訪問的語句。顯然,我們可以用這種方法代替第二種方法,即使父窗體不是容器,我們也照樣可實現兄弟窗體間數據的傳遞,當然前提是窗體都處於打開狀態。假設現在又有一個子窗體form3,此時,必須在父窗體中把兩個子窗體都定義成public:Form2 frm2 =new Form2(this) ; Form3 frm3 =newForm3(this)。如果Form2訪問Form3,在Form2中,通過如下方式:string text=this.frm1.frm3.textbox1.text便取得了Form3中textbox1的text值。在Form2中修改Form3中textbox1的text值也同理可以做到。