2010-03-10 35 views
3

這可能很簡單,但我似乎無法弄清楚。使用GetField調用成員。在VB.NET中找不到字段

我有一堆被宣佈爲(以frmAquRun.Designer.vb)

Public WithEvents btnAquRunEvent1 As VisibiltyButtonLib.VisibilityButton 
Public WithEvents btnAquRunEvent2 As VisibiltyButtonLib.VisibilityButton 

表單設計器創建的窗體的項目...等

我基本上要能夠提供一個函數的數字訪問每個這些字段。所以我寫了這個函數。 (in frmAquRun.vb)

Const EVENT_BUTTON_PREFIX As String = "btnAquRunEvent" 
Public Function getEventButton(ByVal id As Integer) As Windows.Forms.Button 

    Dim returnButton As Windows.Forms.Button = Nothing 
    Try 
     returnButton = DirectCast(Me.GetType().InvokeMember(eventButtonName, Reflection.BindingFlags.GetField Or Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance, Nothing, Me, Nothing), Windows.Forms.Button) 
    Catch ex As Exception 
    End Try 
    Return returnButton 
End Function 

但它似乎總是生成字段沒有發現異常。 異常中的消息是「未找到字段'ATSIS_ControlProgram.frmAquRun.btnAquRunEvent1'」。

消息中的命名空間和形式的名稱是正確的。任何想法我做錯了什麼?

回答

3

的問題是,對於WithEvents領域,VB實際上創建了做必要的事件處理程序安裝和拆卸的屬性。生成的屬性具有該字段的名稱。實際的後臺字段被重命名爲_ +原始名稱。 1),以便您的代碼只是工作由_前綴按鈕的名稱或使用對應屬性的getter的(而不是GetField)的BindingFlag

左右。

或者,您也可以通過使用Controls集合形式的做到這一點輕鬆了不少:

returnButton = DirectCast(Me.Controls(eventButtonName), Windows.Forms.Button) 

但要注意的是這隻能如果按鈕是頂級的,即沒有嵌套的容器控件中在窗體上。


1)這是VB編譯器的實現細節,但因爲對WithEvents場的處理是非常詳細的VB語言規範描述了它的便攜(尤其是單聲道的vbnc編譯器)。

+0

感謝,對的BindingFlags設置的getProperty的伎倆。我不知道控件對象的形式,我將它定義爲將來引用的形式,但事件按鈕位於不同的容器中,因此它會使事情變得複雜一些。 – Isaiah 2010-03-10 00:26:31

0

的問題是,事件處理程序是不是真的領域。經過編譯,它們確實是實現add_btnAquRunEventX,remove_btnAquRunEventX和fire_btnAquRunEventX方法的屬性。有許多方法可以解決這個問題,但這可能不是解決問題的最佳方式。相反,您可以簡單地創建一個List,然後用事件處理程序填充它,然後索引到該列表中。

我在VB語法有點生疏,但它應該是這個樣子:

Dim events = New List<EventHandler>() 
events.Add(btnAquRunEvent1) 
events.Add(btnAquRunEvent2) 

.... 

events(0)(null, EventArgs.Empty) 

退一步雖然回顧和評估你爲什麼要通過指數調用。可能有一種更簡單的抽象方式,不涉及所有這些間接性。

+0

您對事件處理程序的描述是正確的,但OP不*詢問事件處理程序,而是詢問'WithEvent'字段。 – 2010-03-10 00:15:04

+0

謝謝,我之前使用的方法如上所述,但我想要設置某種方法並忘記添加/刪除從設計器中的按鈕的方式(因爲它可能在某些罕見情況下需要由而不是軟件設計師。) – Isaiah 2010-03-10 00:29:33

+0

那麼這就突出了我的VB智慧。我認爲WithEvents語法與C#的event關鍵字基本相同。 – 2010-03-10 11:37:55