在編寫C#windows應用程式的時候我們經常會遇到這種問題,怎麼樣在兩個表單間傳遞資料呢?例如,用C#做一個文字編輯器,裡面有一個搜尋功能(即搜尋我開啟的文本裡面的文字),點搜尋則彈出搜尋對話方塊,輸入要搜尋的內容,然後確定,就可以搜尋到我開啟的文本裡面的文字了,這裡就用到了兩個表單間的相互連信。我查看了相關的資料想了想,得出一些想法和方法。
也許有的人會覺得這個很簡單呀。假如主架構為Form1,開啟的搜尋對話方塊是Form2.直接在Form2類中申明一個Form1執行個體:Form1 f1=new Form1();然後就可以通過f1來調用Form1中的域和函數了。其實不是這樣的,你申明的新的Form1執行個體不是原來的那個Form1對象了,這樣操作的是新的Form1中的域和函數,和最先開啟的Form1是沒有關係的。
那應該如何來完成兩個表單的通訊呢?我們要做的是把當前的Form1執行個體傳遞給Form2,如果是這樣的話,問題就很好解決了。
方法1:首先,我們在Form2中定義:
private Form1 mF_Form
我們更改Form2的建構函式為有參數的
public Form2 ( Form1 myForm )
{
//
// Windows 表單設計器支援所必需的
//
InitializeComponent ( ) ;
this.mF_Form = myForm ; /////這樣在Form1中申明Form2的時候就把Form1的執行個體傳遞過來了
//
// TODO: 在 InitializeComponent 調用後添加任何建構函式代碼
//
}
在Form1中,我在 要用到Form2的地方申明如下:
Form2 f2=new Form2(this);////這裡的this指的就是Form1當前的執行個體,也就是把當前Form1的執行個體通過Form2的建構函式傳遞給Form2類(其實在網上看到過比較蠢的方式,就是在建構函式裡面傳遞要傳遞的資訊如:字串或是數字等,這樣做很有局限性,不能傳遞其他的,所有我們可以直接傳遞執行個體,來完成傳遞更多的資訊。)
這樣在Form2中使用myForm 就可以對原來的Form1視窗進行操作了。但是你要把要操作的Form1中的域和函數定義成public形式的(這樣可能不安全),此時的myForm就是真正的最開始開啟的Form1了,你可以用這個執行個體來進行兩個表單的通訊了。
方法2:其實C#中提供了表單間進行通訊的現成的屬性,呵呵,我們能想到的,微軟也想到了,他們創造的語言其實確實可以說是人性化了。
在Form1類中申明Form2時用如下代碼:
Form2 f2=new Form2();//////類Form2中的建構函式不改,還是無參的
f2.owner=this;////這裡的this指的是類Form1當前的執行個體。
//也可以使用函數的方法,給當前執行個體添加一個附屬視窗 代碼:this.AddOwnedForm(f2);
在Form2類的定義中寫如下代碼:
Form1 f1=this.owner;
這樣f1對應的就是原來的Form1的執行個體了,也就可以用這個進行通訊了。但是還是要把不同類之間訪問的域和函數定義成public,哎,安全確實是一個問題!!
慢慢解決中......(將public改成protected internal 讓繼承類或者是同一個程式集中的類進行訪問)
不知道還有沒有其他的方法,有的話請告訴我~~~~