C#視窗間傳遞訊息

hemeinvyiqiluoben發表於2014-12-04

http://blog.csdn.net/chenyuling/archive/2007/05/25/1625907.aspx

我用的方法是:見下面我在白雲的帖子

發信人: CCBB (超超飽飽|酒飽飯足~~), 信區: DotNet
標  題: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月04日22:03:00 星期三)

一個主視窗MainForm和一個對話方塊視窗DialogForm。主視窗通過一個選單項調出對話方塊窗
口。對話方塊視窗有個儲存按鈕,點選儲存按鈕後,對話方塊關閉,並且將儲存資訊存入檔案
中。
問題是:當點選儲存按鈕後,如何告知MainForm這個訊息呢,我想要點選儲存後就能在Mi
anForm上顯示修改後的資訊。
本來想在MainForm中設一個static變數,點選儲存按鈕把訊息傳給這個變數,但是點選之
後又如何立刻知道這個變數被修改了呢?

--

You are beautiful, You are beautiful, it's true.

But it's time to face the truth...I will never be with you...

  ╭———╮

※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

發信人: joshuaG (Big G|Solution, Revolution, Evolution), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月04日22:11:13 星期三), 站內信件

例如說你要把對話方塊裡的一個TextBox的文字儲存在MainForm裡頭,這樣

假設這個TextBox是_tb

在DialogForm中定義一個Property:

public string Data { get{return _tb.Text;}}

同時把儲存按鈕的DialogResult屬性設定為OK

然後在MainForm的開啟對話方塊的方法中寫

DialogForm frm=new DialogForm();
if(frm.ShowDialog()==DialogResult.OK)
    val = frm.Data;

其中val是你要賦值的變數 

【 在 CCBB (超超飽飽|酒飽飯足~~) 的大作中提到: 】
: 一個主視窗MainForm和一個對話方塊視窗DialogForm。主視窗通過一個選單項調出對話方塊窗
: 口。對話方塊視窗有個儲存按鈕,點選儲存按鈕後,對話方塊關閉,並且將儲存資訊存入檔案
: 中。
: 問題是:當點選儲存按鈕後,如何告知MainForm這個訊息呢,我想要點選儲存後就能在Mi
: anForm上顯示修改後的資訊。
: 本來想在MainForm中設一個static變數,點選儲存按鈕把訊息傳給這個變數,但是點選之
: 後又如何立刻知道這個變數被修改了呢?

--
                有四類人
                積極採取行動促使事件發生的人
                被動接受所發生事件的人
                對事件持旁觀者心態的人
                什麼事也不關心的人
                而我要做的當然是第一種人,能做出變革和業績的人 
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

發信人: CCBB (超超飽飽|酒飽飯足~~), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月04日22:27:08 星期三)

明白了,用個DialogResult屬性...多謝~!!
【 在 joshuaG 的大作中提到: 】
: 例如說你要把對話方塊裡的一個TextBox的文字儲存在MainForm裡頭,這樣
: 假設這個TextBox是_tb
: 在DialogForm中定義一個Property:
--
You are beautiful, You are beautiful, it's true.
  ╭———╮
  │╯╰ │
  │ 口 ├┬—╮
  ╰——┬╯│╭╯
  ╯ ╯╰—

※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

發信人: hustorochi (Mark Zhou), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月09日20:48:08 星期一)

請使用事件解決此問題。

首先需要在 Dialogform 中宣告如下事件和函式。

public event EventHandler SavedData;

protected virtual void OnSavedData(EventArgs e)
{
    if (this.SavedData != null)
    {
        this.SavedData(e);
    }
}

然後在"儲存"按鈕處理事件中引發該事件。

private void OnSaveButtonClick(object sender, EventArgs e)
{
    // TODO: Save your data.
    WriteDataToFile();
    OnSavedData(new EventArgs());
}

最後在 MainForm 開啟對話方塊的時候。

public void OnOpenDialogMenuItemClick(object sender, EventArgs e)
{
    DialogForm form = new DialogForm();
    // Subscribe the SavedData event.
    form.SavedData += (_sender, _e) => RefreshData();
    form.ShowDialog();
}

請儘量減少使用通過 ShowDialog() 的返回值 DialogResult 判斷商業邏輯。這樣會導致
無法維護的程式碼增加。

【 在 CCBB 的大作中提到: 】
: 一個主視窗MainForm和一個對話方塊視窗DialogForm。主視窗通過一個選單項調出對話..
: 口。對話方塊視窗有個儲存按鈕,點選儲存按鈕後,對話方塊關閉,並且將儲存資訊存入..
: 中。

--
Mark Zhou
Software Design Engineer (SDE)
Solution Delivery Engineer at Microsoft
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

發信人: joshuaG (G | 我們如何才能更加了解彼此呢?), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月09日22:28:41 星期一), 站內信件

學習了
【 在 hustorochi (Mark Zhou) 的大作中提到: 】
: 
: 請使用事件解決此問題。
: 
: 首先需要在 Dialogform 中宣告如下事件和函式。
: 
: public event EventHandler SavedData;
: 
--

I Love Rock & Roll

    I Love Art & War
http://newhost.byhh.net/f/DotNet/1161499057/eyes.jpg
        I Love U After All 
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
發信人: doubleclick (強悍地解釋人生), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月09日23:38:16 星期一), 站內信件

融哥能否談談 "請儘量減少使用通過 ShowDialog() 的返回值 DialogResult 判斷商業邏
輯。這樣會導致
無法維護的程式碼增加。" 這具體是如何引起的? 另外就樓主這個問題,這裡為什麼不用for
m2的構造器直接傳引數進去? 

謝謝

【 在 hustorochi (Mark Zhou) 的大作中提到: 】: 
: 請使用事件解決此問題。
: 
: 首先需要在 Dialogform 中宣告如下事件和函式。
: 
: public event EventHandler SavedData;
: 
: protected virtual void OnSavedData(EventArgs e)
: {
:     if (this.SavedData != null)
: .................(以下省略)

--
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·[FROM: fox23.cnblogs.com

 

發信人: yuxhust (happy fish), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月10日16:33:37 星期二)

按LZ的需求,也可以用MDIParent窗體
【 在 CCBB 的大作中提到: 】
: 一個主視窗MainForm和一個對話方塊視窗DialogForm。主視窗通過一個選單項調出對話..
: 口。對話方塊視窗有個儲存按鈕,點選儲存按鈕後,對話方塊關閉,並且將儲存資訊存入..
: 中。
: 問題是:當點選儲存按鈕後,如何告知MainForm這個訊息呢,我想要點選儲存後就能..

--
http://newhost.byhh.net/f/Picture/1234163724/2009_2_9_151323.bmp
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
發信人: joshuaG (G|想念變成一條線 在時間裡面蔓延), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月10日16:34:20 星期二), 站內信件

MDI是用於多文件的,用在這種Dialog上面顯然不合適。

【 在 yuxhust (happy fish) 的大作中提到: 】
: 按LZ的需求,也可以用MDIParent窗體
: 【 在 CCBB 的大作中提到: 】
: : 一個主視窗MainForm和一個對話方塊視窗DialogForm。主視窗通過一個選單項調出對話..
: : 口。對話方塊視窗有個儲存按鈕,點選儲存按鈕後,對話方塊關閉,並且將儲存資訊存入..
: : 中。
: : 問題是:當點選儲存按鈕後,如何告知MainForm這個訊息呢,我想要點選儲存後就能..

--
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·[FROM:Utopian Blue]

 

 
發信人: yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日00:32:29 星期三), 站內信件

~這個非常好
可以算是一個利用事件的最佳實踐吧
事件或者觀察者模式在這裡產生的鬆耦合是非常有意義的

【 在 hustorochi (Mark Zhou) 的大作中提到: 】
: 
: 請使用事件解決此問題。
: 
: 首先需要在 Dialogform 中宣告如下事件和函式。
: 
: public event EventHandler SavedData;
: 

--

    上善若水
    水利萬物而不爭
Hello you, Hello me, Hello World...
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 

 
發信人: yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日00:39:30 星期三), 站內信件

DialogResult也就用CommonDialog時候好用

自己定義的DialogForm形式多樣,DialogResult並不是一個必須的東西,不是規範

所以完全沒有辦法保證自定義的DialogForm會返回這麼個物件

換句話說

如果在主程式裡面試用了DialogResult,那麼主程式就對DialogForm有了依賴,依賴來
自於DialogResult

lz的問題看情況

我覺得如果是利用一個DialogForm修改一個全域性的值,設定主窗體的static變數或者使
用單例模式儲存全域性變數就可以了

如果是需要對區域性變數在DialogForm中進行計算處理等工作,返回處理的值,完全可以
用構造器引數,但是無論何種方法都沒有提供值改變通知功能

因此需要新增一個SavedData事件來反向通知呼叫者值的變化,主程式可以通過訂閱事件
重新整理資料,這也就是上面程式解決的問題

【 在 doubleclick (強悍地解釋人生) 的大作中提到: 】
: 融哥能否談談 "請儘量減少使用通過 ShowDialog() 的返回值 DialogResult 判斷商業邏
: 輯。這樣會導致
: 無法維護的程式碼增加。" 這具體是如何引起的? 另外就樓主這個問題,這裡為什麼不用for
: m2的構造器直接傳引數進去? 
: 謝謝

--

    上善若水
    水利萬物而不爭
Hello you, Hello me, Hello World...
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
發信人: hustorochi (Mark Zhou), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日12:57:17 星期三)

我們在編寫程式的時候,應該儘量減少元件之間的偶合性,對於 DialogResult,它依賴於
 ModalDialog,如果程式顯示的是一個 Modaless Dialog,那麼 DialogResult 不產生任
何值,從而 UI 的改變導致了程式碼的改變。

另一方面,我也不推薦通過建構函式對 UI 元件傳遞資料。建構函式是用來對其所描述的
類進行例項化的,而不是用來傳遞資料的;換句話說,建構函式應該幹他應該乾的事情。
利用建構函式把一個資料傳進來,而該資料跟這個類(System.Windows.Forms.Form)沒有直
接關係,那麼這就是 Data Corruption。

所以,這裡最好的設計模式就是 Subscribe -> Observer。

【 在 yayxcn 的大作中提到: 】
: DialogResult也就用CommonDialog時候好用
: 自己定義的DialogForm形式多樣,DialogResult並不是一個必須的東西,不是規範
: 所以完全沒有辦法保證自定義的DialogForm會返回這麼個物件
: 換句話說
: 如果在主程式裡面試用了DialogResult,那麼主程式就對DialogForm有了依賴,依賴..
: 自於DialogResult
: lz的問題看情況

--
Mark Zhou
Software Design Engineer (SDE)
Solution Delivery Engineer at Microsoft
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
發信人: wpboy (我愛抬槓,但我更愛真理), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日13:05:32 星期三), 站內信件

我以前寫程式碼很有潔癖,覺得就應該用正確的優雅的方法。
然後偶然發現好比“單身宿舍”,如果不考慮以後擴充套件為
兩人世界三口之家的,為啥搞這麼幹淨,人活得多累啊。
很多人寫的小程式可能也就他自己用用,別人都不會去維
護的,更不會去擴充套件,所以能以最簡單的方法搞定即可。
有時太多的模式啊框架啊,對於我們這種入門級的,還是
很有難度的。是吧,加菲~~敲這麼多字不容易

【 在 hustorochi (Mark Zhou) 的大作中提到: 】
: 
: 我們在編寫程式的時候,應該儘量減少元件之間的偶合性,對於 DialogResult,它依賴於
:  ModalDialog,如果程式顯示的是一個 Modaless Dialog,那麼 DialogResult 不產生任
: 何值,從而 UI 的改變導致了程式碼的改變。
: 
: 另一方面,我也不推薦通過建構函式對 UI 元件傳遞資料。建構函式是用來對其所描述的
: 類進行例項化的,而不是用來傳遞資料的;換句話說,建構函式應該幹他應該乾的事情。
: 利用建構函式把一個資料傳進來,而該資料跟這個類(System.Windows.Forms.Form)沒有直
: 接關係,那麼這就是 Data Corruption。
: 
: .................(以下省略)

--
博士第一年:我要當一個牛博士        
博士第二年:我要三年畢業            
博士第三年:我要四年畢業            
博士第四年:愛怎麼著就怎麼著吧      
博士第……:苦海無邊回頭是岸        
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
 
發信人: yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日16:13:54 星期三), 站內信件

是 難度肯定是有
模式啊框架啊什麼的
就是前人總結的經驗
就是寫了n多程式碼總結出來的最好的方式,所謂的最佳實踐,這麼搞總體效率最高,所以才
這樣
如果是本著自己用用不維護的目的,自然也就無所謂模式框架什麼的
不過如果是工業化的開發,不是玩玩的程式碼,這些模式啊框架啊就是極其有用了

但是寫程式碼可以沒有潔癖,但不能不愛乾淨
--

    上善若水
    水利萬物而不爭
Hello you, Hello me, Hello World...
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
 
發信人: yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日16:30:12 星期三), 站內信件

UI元件 和 資料 的繫結說到點上了。。。
我覺得這地方也不用完全追求分離
其實Winform裡面UI元件和資料本來就是在一起的
比如xxxForm類裡面經常有個類似RefreshData方法,從理論上來說這也是不合理的,Form
就應該做Form的事情,顯示東西和操作互動就行了,把資料的操作放在另一個地方,也就
是MVC模式,但這樣顯然不可能,至少還需要一個方法去通知資料的變化,於是就妥協的保
留了一兩個類似RefreshData這樣的方法,也被叫成MVP模式
一般而言這種實現方式還是不錯的,這種方式下Form一般只持有一個對DataModel的引用,
然後擁有一個類似RefreshData這樣的資料響應方法,而我也經常習慣於在構造器中要求傳
入這樣的DataModel,因為我看來這種情況下Form和Data就是一體,沒有DataModel的Form
是沒有意義的

P.S. WPF引入資料繫結後,DataContext之類概念後,實現變得漂亮很多~Form終於不用自
己去持有那個對DataModel的引用了
【 在 hustorochi (Mark Zhou) 的大作中提到: 】: 
: 我們在編寫程式的時候,應該儘量減少元件之間的偶合性,對於 DialogResult,它依賴於
:  ModalDialog,如果程式顯示的是一個 Modaless Dialog,那麼 DialogResult 不產生任
: 何值,從而 UI 的改變導致了程式碼的改變。
: 
: 另一方面,我也不推薦通過建構函式對 UI 元件傳遞資料。建構函式是用來對其所描述的
: 類進行例項化的,而不是用來傳遞資料的;換句話說,建構函式應該幹他應該乾的事情。

--

    上善若水
    水利萬物而不爭
Hello you, Hello me, Hello World...
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

 

 
 
發信人: joshuaG (G|想念變成一條線 在時間裡面蔓延), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日16:31:08 星期三), 站內信件

我對自己的程式碼做Code Metrics分析的時候,糟糕的地方都是在Winform程式碼裡頭出現的

【 在 yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!) 的大作中提到: 】
: UI元件 和 資料 的繫結說到點上了。。。
: 我覺得這地方也不用完全追求分離
: 其實Winform裡面UI元件和資料本來就是在一起的
: 比如xxxForm類裡面經常有個類似RefreshData方法,從理論上來說這也是不合理的,Form
: 就應該做Form的事情,顯示東西和操作互動就行了,把資料的操作放在另一個地方,也就
: 是MVC模式,但這樣顯然不可能,至少還需要一個方法去通知資料的變化,於是就妥協的保
: 留了一兩個類似RefreshData這樣的方法,也被叫成MVP模式
: 一般而言這種實現方式還是不錯的,這種方式下Form一般只持有一個對DataModel的引用,
: 然後擁有一個類似RefreshData這樣的資料響應方法,而我也經常習慣於在構造器中要求傳
: 入這樣的DataModel,因為我看來這種情況下Form和Data就是一體,沒有DataModel的Form
: .................(以下省略)

--
            ┓·    ┓        ·             愛好者協會
★和平演變★┃┓┏┓┣┓╋┳┓┓┳┓┏┓  ┍┅━┅━┅━┅┗┻┗┫┛┗┗┛┗┻┛┗┗┫  ID:joshuaG
   通行證   ┗┛                ┗┛  
━━━━──┼────────────────┺┉編號:07
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·[FROM:Utopian Blue]

 

 
 
發信人: yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!), 信區: DotNet
標  題: Re: [求教]C#如何兩視窗之間傳送訊息
發信站: 武漢白雲黃鶴站 (2009年03月11日16:55:10 星期三), 站內信件

因為form的概念本身就可維護性不怎麼樣
屬於20世紀90年代快速開發概念的遺留產物
iphone android 包括asp.net mvc都拋棄form概念
winform webform最後都沒有成功

【 在 joshuaG (G|想念變成一條線 在時間裡面蔓延) 的大作中提到: 】
: 我對自己的程式碼做Code Metrics分析的時候,糟糕的地方都是在Winform程式碼裡頭出現的
: 【 在 yayxcn (羊肉販子): 販賣羊肉和程式碼 (oh Yannic!) 的大作中提到: 】
: : UI元件 和 資料 的繫結說到點上了。。。
: : 我覺得這地方也不用完全追求分離
: : 其實Winform裡面UI元件和資料本來就是在一起的
: : 比如xxxForm類裡面經常有個類似RefreshData方法,從理論上來說這也是不合理的,Form

--

    上善若水
    水利萬物而不爭
Hello you, Hello me, Hello World...
※ 來源:·武漢白雲黃鶴站 bbs.whnet.edu.cn·

相關文章