C#类中操作UI层控件状态[原]
生活随笔
收集整理的這篇文章主要介紹了
C#类中操作UI层控件状态[原]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一直以來都是接觸B/S開發,很少做C/S開發,線程就用得更少了,最近做一些工作中用到的小軟件終于用上了線程,記錄一些心得.
場景:
??????1:假設有窗體F,里面有一按鈕BtnA,及一Label控件.
????? 2:有一類A,里面有一方法Start().
要求:
??????點擊按鈕BtnA后,根據Start()方法里面操作邏輯,將狀態顯示在Label中.
最開始做的時候是實例化類A的時候將整個窗體或者要改變值的控件傳入類A中,然后再在類A中操作,可想而知這樣是非常不好的.
查閱資料后,終于找到了一點解決方法:利用委托或事件,以下是基本代碼.
Code 窗體代碼
?1?private?void?BtnA_Click(object?sender,?EventArgs?e)
?2????????{
?3????????????A?ms?=?new?A();
?4????????????//委托方法{實例化類A中定義的委托}
?5????????????//ms.tt=?new?A.dSetSourceInfo(this.SetInfoOne);
?6????????????//或
?7????????????//事件觸發{注冊類A中定義的事件}
?8????????????ms.SetInfo?+=?new?EventHandler(ms_SetInfoTwo);
?9????????????Thread?m?=?new?Thread(new?ThreadStart(ms.Start));
10????????????m.Start();
11????????}
12
13
14//委托
15
16????????private?delegate?void?mySetInfo(string?s);
17????????void?SetInfoOne(string?s)
18????????{
19????????????if?(this.InvokeRequired)
20????????????{
21????????????????this.Invoke(new?mySetInfo(SetInfoOne),?s);
22????????????????return;
23????????????}
24????????????this.Label1.Text?=?s;
25????????}
26
27
28//事件
29
30????????void?ms_SetInfoTwo(object?sender,?EventArgs?e)
31????????{
32????????????if?(this.InvokeRequired)
33????????????{
34???????????????this.Invoke(new?System.EventHandler(ms_SetInfoTwo),?sender);
35???????????????return;
36????????????}
37????????????this.Label1.Text?=?(string)sender;
38????????}
Code 類A
?1??public?class?A?
?2????{
?3????????//定義事件
?4????????public?event?EventHandler?SetInfo;
?5????????//類A中執行的事件
?6????????private?void?SetSourceInfo(object?sender,?EventArgs?e)
?7????????{
?8????????????if?(SetInfo!=?null)?{?SetInfo(sender,?e);?}
?9????????}
10????????//或
11????????//定義委托
12????????public?dSetSourceInfo tt;
13????????public?delegate?void?dSetSourceInfo(string?str);
14????????//類A中執行的方法
15????????private?void?SetSourceInfott(string?str)
16????????{
17????????????if?(tt?!=?null)?{?tt(str);?}
18????????}
19????????public?A()?{?}
20???????
21???????/**////?<summary>
22???????///?開始
23????????///?</summary>
24????????public?void?Start()?
25????????{
26????????????//委托使用
27????????????//SetSourceInfott("哈哈哈");
28????????????//Thread.Sleep(1000);
29????????????//SetSourceInfott("哈哈哈1");
30????????????//Thread.Sleep(1000);
31????????????//SetSourceInfott("哈哈哈2");
32????????????
33????????????//事件使用
34??????????????SetSourceInfo("哈哈哈",null);
35????????????Thread.Sleep(1000);
36????????????SetSourceInfo("哈哈哈1",null);
37????????????Thread.Sleep(1000);
38????????????SetSourceInfo("哈哈哈2",null);
39????????}
40?????}
以上為一些簡單的應用,其它復雜的基本上都可以按照這一招來做.
場景:
??????1:假設有窗體F,里面有一按鈕BtnA,及一Label控件.
????? 2:有一類A,里面有一方法Start().
要求:
??????點擊按鈕BtnA后,根據Start()方法里面操作邏輯,將狀態顯示在Label中.
最開始做的時候是實例化類A的時候將整個窗體或者要改變值的控件傳入類A中,然后再在類A中操作,可想而知這樣是非常不好的.
查閱資料后,終于找到了一點解決方法:利用委托或事件,以下是基本代碼.
Code 窗體代碼
?1?private?void?BtnA_Click(object?sender,?EventArgs?e)
?2????????{
?3????????????A?ms?=?new?A();
?4????????????//委托方法{實例化類A中定義的委托}
?5????????????//ms.tt=?new?A.dSetSourceInfo(this.SetInfoOne);
?6????????????//或
?7????????????//事件觸發{注冊類A中定義的事件}
?8????????????ms.SetInfo?+=?new?EventHandler(ms_SetInfoTwo);
?9????????????Thread?m?=?new?Thread(new?ThreadStart(ms.Start));
10????????????m.Start();
11????????}
12
13
14//委托
15
16????????private?delegate?void?mySetInfo(string?s);
17????????void?SetInfoOne(string?s)
18????????{
19????????????if?(this.InvokeRequired)
20????????????{
21????????????????this.Invoke(new?mySetInfo(SetInfoOne),?s);
22????????????????return;
23????????????}
24????????????this.Label1.Text?=?s;
25????????}
26
27
28//事件
29
30????????void?ms_SetInfoTwo(object?sender,?EventArgs?e)
31????????{
32????????????if?(this.InvokeRequired)
33????????????{
34???????????????this.Invoke(new?System.EventHandler(ms_SetInfoTwo),?sender);
35???????????????return;
36????????????}
37????????????this.Label1.Text?=?(string)sender;
38????????}
Code 類A
?1??public?class?A?
?2????{
?3????????//定義事件
?4????????public?event?EventHandler?SetInfo;
?5????????//類A中執行的事件
?6????????private?void?SetSourceInfo(object?sender,?EventArgs?e)
?7????????{
?8????????????if?(SetInfo!=?null)?{?SetInfo(sender,?e);?}
?9????????}
10????????//或
11????????//定義委托
12????????public?dSetSourceInfo tt;
13????????public?delegate?void?dSetSourceInfo(string?str);
14????????//類A中執行的方法
15????????private?void?SetSourceInfott(string?str)
16????????{
17????????????if?(tt?!=?null)?{?tt(str);?}
18????????}
19????????public?A()?{?}
20???????
21???????/**////?<summary>
22???????///?開始
23????????///?</summary>
24????????public?void?Start()?
25????????{
26????????????//委托使用
27????????????//SetSourceInfott("哈哈哈");
28????????????//Thread.Sleep(1000);
29????????????//SetSourceInfott("哈哈哈1");
30????????????//Thread.Sleep(1000);
31????????????//SetSourceInfott("哈哈哈2");
32????????????
33????????????//事件使用
34??????????????SetSourceInfo("哈哈哈",null);
35????????????Thread.Sleep(1000);
36????????????SetSourceInfo("哈哈哈1",null);
37????????????Thread.Sleep(1000);
38????????????SetSourceInfo("哈哈哈2",null);
39????????}
40?????}
以上為一些簡單的應用,其它復雜的基本上都可以按照這一招來做.
轉載于:https://www.cnblogs.com/Mars_Chen/archive/2009/10/10/1580299.html
總結
以上是生活随笔為你收集整理的C#类中操作UI层控件状态[原]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 把Array说透(续一)
- 下一篇: 【收集】EJB3.0的各应用服务器提供的