Visual Basic .NET中多 Windows 表單的同步

來源:互聯網
上載者:User
visual|window 這是一個有趣的問題。我保證某些聰明的編程好手會建議我使用委託。在這種事情發生之前,讓我們 先探究一下這個問題的幾種解決方案。
  假定我有兩個表單,每個表單都有兩個 textbox 控制項:txt1stData 和 txt2ndData。我怎樣才能保持這兩個表單中的控制項同步呢?對於我們討論的問題來說,有兩個或十個表單都不重要,問題是相同的。
  第一個辦法相對簡單。事實上,它甚至比我們直接使用委託更為簡單,我想委託有時會給人用牛刀殺雞的感覺。首先,我建立一個類它包含我希望與應用程式中的所有表單共用的屬性(參見 Figure 1)。例如,MyData 和 MoreData 擁有每個表單都能顯示的資料。我將很快回到這個類來。
  第二,正如我早先提到的我用相同的控制項(txt1stData 和 txt2ndData)建立了兩個表單。你可以參考 Figure 2 的布局。兩個表單都有完全相同的資料,並且我將很快解釋為什麼。


Figure 2 表單布局

下面,我建立一個名為 modGeneral 的模組並加入下面一行代碼:

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

將你的問題以及對 Ken 的評論發送到 basics@microsoft.com



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.