Sunday, September 22, 2013

VB.Net: 動態使用的 Eventhandlers

WithEvents 和控制碼的條款要求的窗我們要聲明的物件變數和事件處理常式,如我們寫我們的代碼,所以在編譯時創建的聯繫。另一方面,與 AddHandler 和 RemoveHandler,聯繫創建和移除在運行時,這是更加靈活。


讓我們假設我們想要載入多個 MDI 子表單,允許每人只有一次,要載入,當然要知道其中一個子表單關閉時。因為我們有幾種形式載入我們想這樣我們可以靈活並編寫少量的代碼,我們可以使用 AddHandler 和 RemoveHandler 關鍵字。


讓我們把弄髒。


1.我們要在每個 MDI 子表單中聲明一個公共事件。
公共事件 FormClosed (ByVal f 作為表單)


2.在每個 MDI 子表單中我們今日要使用 Form_Closed 方法處理的 MyBase.Closed 類並引發 FormClosed 事件。


私營 Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) _
控制碼 MyBase.Closed
RaiseEvent FormClosed(Me)
End Sub


3.我們需要在我們的 MDI 表單上聲明兩個成員變數。第一個的表單類型的第二個類型是 ArrayList。
作為表單的私營 m_f(0)
作為新 ArrayList 私營 m_sLoadedChildForms


4我們需要實現意願的一種方法搜索載入的 MDI 子表單。當我們卸載 MDI 子表單時,我們還將使用此方法。


私有函數 SearchChildForm(ByVal strSearchForm As String, _Optional ByVal idxEventHandler As Long =-1) 作為長
變暗我作為長 = 0
I = 0 到 m_sLoadedForms.Count-1
如果 m_sLoadedForms.Item(i) 然後 = strSearchForm
只要暗 j = 0
J = m_f.GetLowerBound(0) 到 m_f.GetUpperBound(0)
如果 m_f(j)。名稱 = strSearchForm 然後 idxEventHandler = j
下一個 j
返回我
如果結束
下一步
返回-1
結束函數


5.我們需要實現一個方法來載入 mdi 子表單並使用 SearchChildForm 方法按順序不載入相同的 mdi 子表單第二次。


私營 Sub LoadChildForms(ByVal f As Form)
如果 m_f.GetUpperBound(0) > 0 然後
ReDim Preserve m_f(m_f.GetUpperBound(0) + 1)
如果結束
m_f(m_f.GetUpperBound(0)) = f 我
f 不 SearchChildForm(m_f(m_f.GetUpperBound(0))。Name()) > = 0,然後
m_f(m_f.GetUpperBound(0))。MdiParent = 我
AddHandler m_f(m_f.GetUpperBound(0))。封閉,_
AddressOf UnloadChildForm
m_f(m_f.GetUpperBound(0))。Show()
m_sLoadedChildForms.Add(m_f(m_f.GetUpperBound(0))。名稱)
其他
如果 m_f.GetUpperBound(0) > 0 然後
ReDim Preserve m_f(m_f.GetUpperBound(0)-1)
如果結束
如果結束
End Sub


6.最後我們需要實現一個方法,拿出我們的 mdi 子表單從陣列清單中,所以我們再次可以載入它,如果我們想要。


私營 Sub UnloadForm(ByVal sender As System.Object, ByVal e As System.EventArgs)
暗我只要
變暗 s 作為字串 = 寄件者。Gettype ()。名稱
變暗 IndexForEventHandler =-1
我 = SearchChildForm (s,IndexForEventHandler)
如果我 > = 0 然後 m_sLoadedForms.RemoveAt(i)
如果 IndexForEventHandler > = 0,然後
RemoveHandler m_f(IndexForEventHandler)。關閉,AddressOf UnloadForm
m_f(IndexForEventHandler) = 無
如果結束
End Sub

No comments:

Post a Comment