六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

Visual Basic .NET中多 Windows 窗體的同步

[摘要]這是一個(gè)有趣的問題。我保證某些聰明的編程好手會(huì)建議我使用委托。在這種事情發(fā)生之前,讓我們 先探究一下這個(gè)問題的幾種解決方案。  假定我有兩個(gè)窗體,每個(gè)窗體都有兩個(gè) textbox 控件:txt1st...
這是一個(gè)有趣的問題。我保證某些聰明的編程好手會(huì)建議我使用委托。在這種事情發(fā)生之前,讓我們 先探究一下這個(gè)問題的幾種解決方案。
  假定我有兩個(gè)窗體,每個(gè)窗體都有兩個(gè) textbox 控件:txt1stData 和 txt2ndData。我怎樣才能保持這兩個(gè)窗體中的控件同步呢?對(duì)于我們討論的問題來說,有兩個(gè)或十個(gè)窗體都不重要,問題是相同的。
  第一個(gè)辦法相對(duì)簡(jiǎn)單。事實(shí)上,它甚至比我們直接使用委托更為簡(jiǎn)單,我想委托有時(shí)會(huì)給人用牛刀殺雞的感覺。首先,我建立一個(gè)類它包含我希望與應(yīng)用程序中的所有窗體共享的屬性(參見 Figure 1)。例如,MyData 和 MoreData 擁有每個(gè)窗體都能顯示的數(shù)據(jù)。我將很快回到這個(gè)類來。
  第二,正如我早先提到的我用相同的控件(txt1stData 和 txt2ndData)建立了兩個(gè)窗體。你可以參考 Figure 2 的布局。兩個(gè)窗體都有完全相同的數(shù)據(jù),并且我將很快解釋為什么。


Figure 2 窗體布局

下面,我建立一個(gè)名為 modGeneral 的模塊并加入下面一行代碼:

Friend DataStuff As DataClass
  這一行代碼為我的新類 DataClass 創(chuàng)建了一個(gè)友元變量,使你可以完全訪問程序集,對(duì)這個(gè)簡(jiǎn)單例子來說,也就是指完整的應(yīng)用程序。然后我添加了下面的代碼到 Form1 的 Load 事件:
DataStuff = New DataClass Me.txt1stData.DataBindings.Add("Text", DataStuff, "MyData") Me.txt2ndData.DataBindings.Add("Text", DataStuff, "MoreData")
  第一行建立一個(gè) DataClass 新實(shí)例。下面兩行代碼將數(shù)據(jù)綁定到 textbox 控件。對(duì)這個(gè)窗體而言,就這么些操作!
  現(xiàn)在,你怎樣讓它們與 Form2 和其它窗體上的數(shù)據(jù)同步呢?將下面兩行加入到 Form 2 的窗體load 事件中去:
Me.txt1stData.DataBindings.Add("Text",DataStuff, "MyData") Me.txt2ndData.DataBindings.Add("Text",DataStuff, "Moredata")
  這個(gè)方法容易確保所有窗體上的幾乎任何類型的數(shù)據(jù)處于同步狀態(tài)。你可以簡(jiǎn)單地將控件綁定到某個(gè)類的相同實(shí)例上,這就行了。
  現(xiàn)在來看另一個(gè)方法。我創(chuàng)建了一個(gè)名為 frmBase 的新窗體。這時(shí)我在上面放一個(gè) textbox (txtNextData)和 label。我想 讓應(yīng)用程序的每個(gè)窗體都共享這個(gè) textbox 和 label,并且我希望它們互相之間保持同步,于是我重建這個(gè)工程。通過從新的 frmBase 中的繼承 ,我創(chuàng)建了 Form1 和Form2,因此它們繼承了所有新的控件。但是我怎樣能保持這些控件同步呢?這時(shí)必須寫一點(diǎn)代碼去達(dá)到此效果,這些代碼在單個(gè)的類中,通過簡(jiǎn)單地調(diào)用一個(gè)函數(shù)而被復(fù)用。
  Figure 3 中的代碼展示了這個(gè)稱為 modGeneral 模塊。它的第一個(gè)任務(wù)是定義兩個(gè)變量:MyForms 和 localNextData。MyForms 是一個(gè) 集合,它將包含我想要同步的窗體列表。localNextData變量將儲(chǔ)存所有我想要在窗體里顯示的數(shù)據(jù)。注意這些變量可以駐留于某個(gè)類中而不是某個(gè)模塊里。
  AddForm 過程來自 modGeneral,帶一個(gè)窗體實(shí)例參數(shù),并將其加入 MyForms 集合中。我將在UpdateControlsNextData 過程中使用這個(gè) 集合以決定哪些窗體要更新。AddForm 也調(diào)用UpdateControlsNextData 來確保一個(gè)新窗體是用正確的數(shù)據(jù)更新的。
  modGeneral 中的其它代碼是 NextData 屬性。這些屬性的 set 存取器更新 localNextData 并也調(diào)用 UpdateControlsNextData 去同步所有窗體。這時(shí)所有我需要做的是 在想要改變它時(shí)設(shè)置 NextData,通過調(diào)用 UpdateControlsNextData,所有窗體將被更新。
  第三個(gè)方法是定制鏈接,它是第二個(gè)方法的精華版。我創(chuàng)建它以獲得多一些窗體控件處理的靈活性。例如,我只想跟蹤和處理某些窗體,這些窗體包含必須同步的控件。這個(gè)方法 還可以讓我自己定義擬同步的控件,并且只處理這些控件的窗體。
  我為這個(gè)辦法添加了另一個(gè)模塊 (modGeneralv2),如 Figure 4 所示。該模塊包括一個(gè)集合(MyFormsToUpdate),其中包含所有我想要同步的窗體。這個(gè)模塊 還有一個(gè)新的數(shù)組 (ControlsToUpdate),它提供一個(gè)我要同步的控件列表。該數(shù)組的定義如下:
Private ControlsToUpdate() As String = _ {"txtCustomer", "txtAddress", "txtName"}
  這個(gè)模塊里有一個(gè)新的替代 AddForm 的改良版本,叫做 AddFormToUpdate。該方法工作方式與AddForm 類似,但現(xiàn)在它只添加擁有一個(gè)或多 個(gè) ControlsToUpdate 數(shù)組中控件的窗體,因此只有那些含有特定控件的窗體在更新集合中。它使我可以從每個(gè)窗體中調(diào)用該函數(shù)。如果我決定以后添加某個(gè)特定的控件,它將會(huì)被自動(dòng)添加到窗體列表。我只需對(duì)窗體代碼做細(xì)小的改動(dòng)便可以實(shí)現(xiàn)。
  這個(gè)模塊還包含 UpdateControlsOnAllForms 過程,它執(zhí)行更新。代替上一個(gè)方法中使用的一個(gè)應(yīng)用程序級(jí)變量,我現(xiàn)在使用主窗體的概念。因此我可以將那個(gè)窗體的值拷貝到集合中的所有其它窗體。UpdateControlsOnAllForms 其實(shí)就是一組簡(jiǎn)單的 For...Nexts 循環(huán)遍歷某個(gè)窗體的所有控件,找到需要更新的控體,并更新它們。
  為了在我的窗體中實(shí)現(xiàn)這一功能,我在窗體的 Load 事件中加入了這一行代碼:
AddFormToUpdate(Me)
  另外一種可選的方法,我可以將它添加到構(gòu)造函數(shù)。這一行代碼將把當(dāng)前窗體實(shí)例添加到集合進(jìn)行更新。
  現(xiàn)在讓我們考察單個(gè)事件過程:
Private Sub txt_Leave(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles txtAddress.Leave, _ txtCustomer.Leave, txtName.Leave UpdateControlsOnAllForms(Me) End Sub
  這段代碼將我想要同步的所有三個(gè)控件 (txtAddress、txtCustomer 和 txtName)的 Leave 事件捆綁到一個(gè)事件句柄上。這時(shí)我可以添加一行代碼 來調(diào)用 UpdateControlsOnAllForms。Me 被傳遞到該過程調(diào)用,從而導(dǎo)致其它窗體與該窗體同步。
  現(xiàn)在我有三個(gè)版本的代碼,它們都可以同步窗體中控件,因此我可以進(jìn)行選擇。我可能已經(jīng)使用了自定義事件,在 DataClass 中定義某個(gè)事件并讓每個(gè)窗體都預(yù)訂它。 然后當(dāng)這個(gè)事件觸發(fā)時(shí),這些窗體可以從每個(gè)事件句柄中獲取新的數(shù)據(jù)并設(shè)置適當(dāng)?shù)目丶5沁@樣做所需的代碼量一點(diǎn)也不會(huì)比第一種方法中將控件綁定到類來得少。我可以構(gòu)建單個(gè)實(shí)現(xiàn)更新的過程,并將該過程放到某個(gè)模塊中。我需要向該過程傳遞窗體實(shí)例來實(shí)現(xiàn)更新。我可以用類中的某個(gè)事件句柄觸發(fā)這個(gè)過程。此過程看起來就像這樣:
Sub UpdateControls(ByVal ThisForm As frmBase) With ThisForm .txtNextData.Text = localNextData End With End Sub
  ThisForm 參數(shù)被定義為 frmBase 類型,以便它可以訪問 IntelliSense 并獲得窗體的自定義屬性。簡(jiǎn)單地將它寫成 Form 將無法顯示 frmBase 中的屬性及其派生窗體。
  另一選擇是使用委托。當(dāng)然,委托可以讓我將委托調(diào)用重定向到每個(gè)窗體的方法上。如果我使用多播機(jī)制,那么我可以讓每個(gè)窗體都處理該事件并更新相應(yīng)的控件。用委托建立這樣的功能聽起來確實(shí)簡(jiǎn)單,但 對(duì)我來說它更麻煩且沒有實(shí)踐價(jià)值。此外,與第三個(gè)方法中的 For...Next 循環(huán)嵌套相比,這個(gè)代碼并不難理解。畢竟,一個(gè)應(yīng)用程序花費(fèi)最大的部分仍然是它的維護(hù)。

將你的問題以及對(duì) Ken 的評(píng)論發(fā)送到 basics@microsoft.com


主站蜘蛛池模板: 伊人久久综合影院首页 | 婷婷色爱区综合五月激情韩国 | 日日天干夜夜人人添 | 狍和女人一级毛片 | 热久久这里是精品6免费观看 | 特级中国aaa毛片 | 色护士综合| 日产精品一二三四区国产 | 在线天堂新版在线观看 | 日本高清在线一区 | 视频在线观看一区 | 日韩三级黄色片 | 特黄a大片免费视频 | 亚洲 自拍 欧美 综合 | 综合99| 在线免费观看h | 天天干天天干天天天天天天爽 | 速度与激情9全集免费观看 速度与激情9免费完整版高清 | 亚洲成a人片在线观看中文 亚洲成a人片在线观看精品 | 四虎在线观看免费永久 | 日本高清免费在线视频 | 深爱五月激情五月 | 亚洲黄色网页 | 一二三四在线观看免费高清观看 | 日本午夜激情 | 任我爽精品视频在线播放 | 日韩午夜激情视频 | 天天爱天天做色综合 | 青娱乐国产 | 日本xxx在线 | 日本欧美一区二区三区 | 日韩中文字幕免费 | 亚洲精品福利视频 | 日本乱码一卡二卡三卡永久 | 亚洲24p| 亚洲第一色站 | 亚洲污视频 | 青青草原伊人 | 色噜噜狠狠色综合网图区 | 在线a网站 | 天天搞夜夜爽 |