在 .NET中利用委托實(shí)現(xiàn)窗體間通信
2006/12/30 22:46:38
前段時(shí)間寫了一篇關(guān)于在Visual2005中窗體間互訪的文章,介紹了通過使用My命名空間下Forms對(duì)象,可以遵循傳統(tǒng)的VB6.0中的風(fēng)格,實(shí)現(xiàn)窗體間互訪,簡(jiǎn)化了窗體互訪操作,而同時(shí)這也符合眾多VB6.0出身的開發(fā)人員的習(xí)慣。
對(duì)于窗體之間簡(jiǎn)單的通信,上述方法已經(jīng)能很好的滿足我們的要求,但在一些架構(gòu)設(shè)計(jì)復(fù)雜的應(yīng)用中,上面的方法就顯得有點(diǎn)捉襟見肘了,同時(shí)該方法還有一個(gè)缺點(diǎn),就是它僅僅對(duì)于通過.NET窗體向?qū)砑舆M(jìn)去的窗體起作用,而對(duì)于自定義的窗體類型我們是無法添加到Forms對(duì)象集合中的。而且也和其它諸如構(gòu)造函數(shù)傳參等方法一樣,會(huì)在窗體間大量互相引用各自的成員,造成了彼此之間存在著很大的耦合性,非常不利于窗體模塊間的獨(dú)立,這不符合良好軟件設(shè)計(jì)模式的思想。如果我們想在一個(gè)窗體中訪問另一個(gè)窗體中自定義的成員,必須把該成員的可見性設(shè)置為Public或者通過屬性公開,通過屬性公開的話還說得過去,但如果把可見性設(shè)置成Public的,這樣做就無可避免的破壞了類型封裝性的原則,而這一做法也是我們?cè)?NET下開發(fā)相當(dāng)樂意做的,特別是對(duì)于初次接觸.NET的開發(fā)人員,實(shí)現(xiàn)訪問另一類型中成員的話最先想到的就是把該成員的可見性設(shè)置為Public,當(dāng)然這樣做算不上是錯(cuò)誤,但把這一做法作為自己的首要靈感,至少從面向?qū)ο蟮慕嵌瘸霭l(fā)顯然是不合適的。在.NET下,還為我們提供了另外一種強(qiáng)大的機(jī)制來實(shí)現(xiàn)窗體通信,這就是委托。委托可理解為一種類型安全的函數(shù)指針,.NET下的事件的實(shí)現(xiàn)都是以委托做為基礎(chǔ)的。關(guān)于委托在這篇文章中我就不詳細(xì)介紹了,后邊會(huì)有文章專門介紹這一概念。
在此我演示通過在一個(gè)窗體里向另外一個(gè)窗體里的ListBox控件添加Item項(xiàng)來說明這一方法。因此需要兩個(gè)窗體,一個(gè)MainFrm窗體,一個(gè)ChildFrm窗體,另外還需要一個(gè)Middle類,作為MainFrm和ChildFrm之間通信的橋梁。我也將給出VB.NET和C#兩種語言的代碼,以便大家可以做一下比較。
首先是MainFrm窗體,在MainFrm窗體中,拖一個(gè)ListBox控件即可,MainFrm.vb的代碼如下(為簡(jiǎn)單起見,在此省去自動(dòng)生成的代碼):
Public Class Form3
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler Middle.SendMessage, AddressOf DoMethod
End Sub
Private Sub DoMethod(ByVal getstr As String)
Me.ListBox1.Items.Add(getstr)
End Sub
End Class
再看ChildFrm窗體,在其中拖一個(gè)TextBox和一個(gè)Button控件,通過在TextBox中輸入值后,按Button按鈕向MainFrm窗體的ListBox控件中添加Item項(xiàng)。
Public Class Form2
Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Middle.DoSendMessage(TextBox1.Text)
TextBox1.Text = ""
TextBox1.Focus()
End Sub
End Class
最后看Middle類:
Public Class Middle
Public Shared Event SendMessage(ByVal str As String)
Public Shared Sub DoSendMessage(ByVal str As String)
RaiseEvent SendMessage(str)
End Sub
End Class
為了更好的演示MainFrm和ChildFrm之間的獨(dú)立性,修改一下Application.Designer.vb的代碼:
<Global.System.Diagnostics.DebuggerStepThroughAttribute()>
Protected Overrides Sub OnCreateMainForm()
Me.MainForm = Global.WindowsApplication3.MainFrm
ChildFrm.show()
End Sub
好了,代碼完了,是不是很簡(jiǎn)單?通過上面的代碼可以看出來,通過Middle類,MainFrm和ChildFrm都和Middle類通信,它們之間除了參數(shù)的耦
下一頁
返回列表
返回首頁
主站蜘蛛池模板:
久久精品国产免费一区|
内射一区二区精品视频在线观看|
97青青草视频|
岛国片免费在线观看|
四虎在线免费播放|
a色毛片免费视频|
最近免费中文字幕mv在线电影|
含羞草传媒旧版每天免费3次|
92国产精品午夜福利免费|
日本在线视频www色|
亚洲人成网亚洲欧洲无码|
狂野黑人性猛交xxxxxx|
国产成人无码av片在线观看不卡
|
女女互揉吃奶揉到高潮视频|
亚洲国产AV无码一区二区三区|
色欲香天天天综合网站|
在打烊后仅剩两人接档泡面番
|
国产丰满肥熟在线观看|
国产99re在线观看只有精品|
四虎影视www四虎免费|
日韩在线第二页|
小雪你好紧好烫好爽|
亚洲av色影在线|
精品一区二区三区波多野结衣|
国产精品一卡二卡三卡|
99在线免费视频|
一级毛片在线免费视频|
亚洲三级小视频|
老王666天堂网站|
国产色视频免费|
国产ts人妖合集magnet|
国产精品真实对白精彩久久|
奇米影视在线观看|
中国一级特黄aa毛片大片|
欧美亚洲国产一区二区三区|
亚洲精品456在线播放|
色哟哟网站在线观看|
国语自产偷拍精品视频偷拍
|
国产精品免费看|
一级做a爱片特黄在线观看免费看|
日本24小时www|