C#視窗間傳遞訊息
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·
相關文章
- vue---元件間傳遞訊息(父子傳遞訊息,兄弟傳遞訊息)Vue元件
- OCX 控制元件主動傳送訊息給 MFC 視窗訊息控制元件
- Flutter中訊息傳遞Flutter
- Chrome Extension 訊息傳遞Chrome
- dotnet X11 視窗之間傳送滑鼠訊息 模擬滑鼠輸入
- flutter 訊息傳遞機制Flutter
- Handler訊息傳遞機制
- Apache Kafka訊息傳遞策略ApacheKafka
- dotnet 後臺執行緒傳送 X11 視窗訊息執行緒
- Spring Boot 參考指南(訊息傳遞)Spring Boot
- QNX學習 -- API之訊息傳遞API
- Rust 程式設計視訊教程(進階)——017_1 訊息傳遞 1Rust程式設計
- Rust 程式設計視訊教程(進階)——017_2 訊息傳遞 2Rust程式設計
- Rust 程式設計視訊教程(進階)——017_3 訊息傳遞 3Rust程式設計
- C#中實現窗體間傳值方法C#
- Java中用Aeron實現UDP訊息傳遞JavaUDP
- 兄弟元件之間資訊傳遞元件
- InheritableThreadLocal 線上程池中進行父子執行緒間訊息傳遞出現訊息丟失的解析thread執行緒
- NATS訊息傳遞與REST效能比較 | VinsguruREST
- Android之Handler訊息傳遞機制詳解Android
- Pulsar 入門實戰(1)--Pulsar 訊息傳遞
- 3-Windows程式設計 -視窗與訊息Windows程式設計
- RabbitMQ 和訊息傳遞常用一些術語MQ
- .NET 8 中利用 MediatR 實現高效訊息傳遞
- 基於WebSocket的實時訊息傳遞設計Web
- 窗體傳值 父子窗體傳值情況 c# 1231C#
- C#|.net core 基礎 - 值傳遞 vs 引用傳遞C#
- Android Handler訊息傳遞機制:圖文解析工作原理Android
- android 訊息傳遞機制進階EventBus的深入探究Android
- CCF CSP201903-4訊息傳遞介面(c++100)C++
- Python程式專題8:分佈叢集的訊息傳遞Python
- Laravel集合探學系列——高階訊息傳遞實現(二)Laravel
- 在ASP.NET Core 中使用 .NET Aspire 訊息傳遞元件ASP.NET元件
- Go 微服務:基於 RabbitMQ 和 AMQP 進行訊息傳遞Go微服務MQ
- 跨共識訊息格式XCM有幾種傳遞機制?
- Rabbitmq可靠訊息投遞,訊息確認機制MQ
- 訊息佇列與快遞櫃之間的奇妙關係佇列
- RabbitMQ 訊息的可靠投遞MQ
- BYOD時代,如何在企業中保護移動訊息傳遞?