2013-03-15 61 views
0

我寫過一個繼承自System.Windows.Forms.ComboBox的自定義ComboBox控件。它有我寫了一個「Value」屬性如下:爲什麼向類屬性添加<Browsable(False)>屬性會阻止FilterItemOnProperty()正確檢索屬性的值?

Public Property Value() As Object 
    Get 
     If SelectedIndex = -1 Then Return Nothing 
     If String.IsNullOrWhitespace(ValueMember) Then 
      Return Items(SelectedIndex) 
     Else 
      Return FilterItemOnProperty(Items(SelectedIndex), ValueMember) 
     End If 
    End Get 
    Set(ByVal newvalue As Object) 
     '... 
    End Set 
End Property 

基本上,讀取值如果沒有被選中將返回Nothing,所選擇的對象本身,如果ValueMember沒有設置,或相應的屬性值如果設置了ValueMember,則選定的對象。

到目前爲止,代碼工作得很好。

然而,最近的變化已經被用來填充組合框類的一個製作如下:

Partial Public Class Modality 
    <Browsable(False)> 
    Public Property ModalityID As Integer 
    Public Property ModalityName As String 
    Public Property ModalityAbbrevName As String 
End Class 

的ModalityID屬性,它被用作ComboBox的ValueMember,已經具備了可瀏覽(False)屬性,因此當Modality對象集合被綁定到應用程序中其他位置的DataGridView控件時,它不會顯示爲列。

這現在打破了應用程序,因爲即使ComboBox的ValueMember仍設置爲「ModalityID」,MyComboBox1.Value現在將返回選定的Modality對象,而不是所選的Modality對象的ModalityID。

深入研究.NET Framework的源代碼ListControl.FilterItemOnProperty(object item, string field)並不是對我的啓發。

問題是,爲什麼向類屬性添加<Browsable(False)>屬性會阻止FilterItemOnProperty()正確檢索屬性的值?

+0

您是否試過編寫一個簡單的測試應用程序來驗證它是導致問題的BrowsableAttribute?也許還有另外一個你沒有意識到或忘記的修改。 – 2013-03-15 21:58:54

+0

我還沒有創建一個測試應用程序,但是這是在代碼昨天工作和今天工作不正常的時候提交給源代碼控制庫的兩個更改之一(提交的另一個更改是無關的代碼段)。我通過從屬性中移除了'BrowsableAttribute'進一步驗證了它,並且代碼再次運行。 – MCattle 2013-03-15 22:15:49

回答

1

從方法ListControl.FilterItemOnProperty方法(Object,String)的參數中,可以看到屬性名稱以字符串形式出現(由ValueMemeber值給出)。

而且,我沒有使用Reflector,但認爲在方法內部創建了對象的屬性列表,並試圖查找給定的PropertyName爲字符串。

明顯創建一個清單,取決於BrowsableAttribute。如果屬性設置爲False屬性不會列出並且無法查找。

所以,如果這<Browsable(False)>財產只在一個類然後,在代碼,你在讀SelectedValue,只需從選定的對象讀取MobalityID

如果你有乘法類與在您需要考慮舊房名ComboBox作爲ValueMemeber<Browsable(False)>屬性,也許你可以叫他們都只是「ID」爲例。

如果有可能創建一個Inerface,它只有一個屬性.ID,並將其實現到所有Browsable(False)類,然後使用此接口爲類創建泛型Value屬性。然後你可以直接從代碼中獲得ID的屬性。