在 .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|