老題新理解 在話winform之間的窗體傳值

2022-01-13 02:38:13 字數 3463 閱讀 2792

也許當你看到標題的時候,你會想,這窗體間傳值方法就這麼多,無非就是那幾種:

1.靜態變數(這個最簡單)

非時性的傳遞:

1.窗體的屬性

2.建構函式

時時性的傳遞:

1.委託

2.靜態變數(這個最簡單)

幾乎很多人都可以很根據簡單方便的原則選用靜態變數的方式。如果少量的資料傳送,完全沒有問題,但是資料量大,效率的時候,個人覺得使用委託應該是最有效的。

我將記錄我第一次接觸窗體傳值的時候過程:

窗體與窗體之間,就好比兩棟房子,將房子一的資訊傳入到房子二,那就必須有乙個跑腿的。(變數)

一,那這個變數可以做為乙個共用變數,大家都可以使用,需要改變的時候直接賦值就可以了。

那很簡單呀:

二,如果我只需要將提示他傳值呢?(不規定特定變數)使用委託的方式 (上網查詢後了解的)

子窗體:textc  乙個textbox

**:

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

namespace formpost

//為textc宣告乙個公有字段(也可以封裝成屬性)

public delchangetext changetxt;

private void textbox1_textchanged(object sender, eventargs e)}}

//委託類

public delegate void delchangetext(string txt);

}

父窗體:textf 乙個button 乙個textbox 

**:

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

namespace formpost

private void button1_click(object sender, eventargs e)}}

至於和利用屬性傳值和建構函式傳值基本上都是同乙個道理。

這裡,窗體間的傳值都是乙個意思,關鍵是直接傳遞改變的值(靜態變數),還是傳遞的乙個命令(方法),還有csdn上的大神的方法,更好,下面我貼上** :

為了實現這個例子,你需要準備2個視窗,乙個叫mainform,上面至少需要乙個richtextbox,兩個工具欄按鈕。

另乙個叫 mydialog 的子視窗,上面有乙個 textbox1,乙個 button,作為確定按鈕。

兩個工具欄按鈕分別實現兩種形式的窗體呼叫,模態的和非模態的。

模態的意思是,我們開啟對話方塊,將值傳進取,操作完成確定,主窗體再獲得對話方塊的值。

非模態的意思是,我們開啟對話方塊,可以在不關閉視窗的情況下和主窗體互動,主窗體可以即時獲得子窗體的值。類似記事本的查詢替換對話方塊。

下面是**:

主窗體:

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

private mydialog m_dlg;

private void toolstripbutton1_click(object sender, eventargs e)

}private void toolstripbutton2_click(object sender, eventargs e)

);m_dlg.formclosed += new formclosedeventhandler(

(sender2, e2) =>

);m_dlg.show(this);

}else}}

}

子窗體:

using system;

using system.collections.generic;

using system.componentmodel;

using system.data;

using system.drawing;

using system.linq;

using system.text;

using system.windows.forms;

set

}public mydialog() : this("")

public mydialog(string param)

private void textbox1_textchanged(object sender, eventargs e)

private void button1_click(object sender, eventargs e)}}

解釋與說明:

模態傳值的方法是:傳入時可以使用建構函式,傳出的時候首先判斷是否使用者是通過確定關閉的,如果是,那麼用屬性傳出。

這個做法也是框架庫的做法,比如開啟檔案對話方塊。

非模態的情況略微複雜:因為我們需要主窗體能和子窗體實時互動,為了同步主窗體和子窗體的資料,我們用了事件。有人問了,為什麼我們不能讓子窗體直接操作主窗體,這是因為考慮到對話方塊可以被重用,如果讓它直接操作主視窗那麼就限制死了這個子視窗只能被某個特定的主視窗呼叫。為了解除子窗體對呼叫者的耦合,我們使用事件。如果子窗體已經被顯示,主窗體再次呼叫子窗體,那麼通常我們希望啟用子窗體而不是再顯示乙個。具體的實現參考**。

完整的**在此:編譯執行這個**需要 .net framework 4.0。

有任何問題可以提問。**有問題,或者更好的辦法,也歡迎批評。

個人總結:

關鍵還是如何思考問題和如何正確的描述問題

對struct cred新理解

到現在我還沒有看到cred被加入核心的mainline,可惜啊,不過我個人認為它是很不錯的,其精髓就是補丁 上的那一句,就是將權力和授權分離,這句話看似有點不知所云,難道權力不就是授權嗎?其實是不一樣的,權力有一種與生俱來的意思,它是客觀的東西,所謂天 賦人權是也,而授權有種主觀的意思,它可能是暫時...

poll wait新的理解

應用程式使用 select 或 poll 呼叫裝置驅動程式的 poll 函式,該函式把輸入輸出復用處理的等待佇列追加到由核心管理的程序的 poll table 上。此時,poll 函式上傳遞的引數包括含有裝置檔案資訊的 struct file 結構體的指標引數 struct file filp 以及...

對struct cred新理解

到現在我還沒有看到cred被加入核心的mainline,可惜啊,不過我個人認為它是很不錯的,其精髓就是補丁 上的那一句,就是將權力和授權分離,這句話看似有點不知所云,難道權力不就是授權嗎?其實是不一樣的,權力有一種與生俱來的意思,它是客觀的東西,所謂天 賦人權是也,而授權有種主觀的意思,它可能是暫時...