.net 为什么要添加<;可浏览(错误)>;属性阻止FilterItemProperty()正确检索属性';s值多少?

.net 为什么要添加<;可浏览(错误)>;属性阻止FilterItemProperty()正确检索属性';s值多少?,.net,vb.net,winforms,combobox,browsable,.net,Vb.net,Winforms,Combobox,Browsable,我已经编写了一个从System.Windows.Forms.ComboBox继承的自定义ComboBox控件。它有一个“Value”属性,我写了如下: Public Property Value() As Object Get If SelectedIndex = -1 Then Return Nothing If String.IsNullOrWhitespace(ValueMember) Then Return Items(Se

我已经编写了一个从System.Windows.Forms.ComboBox继承的自定义ComboBox控件。它有一个“Value”属性,我写了如下:

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
Partial Public Class Modality
    <Browsable(False)>
    Public Property ModalityID As Integer
    Public Property ModalityName As String
    Public Property ModalityAbbrevName As String
End Class
基本上,如果未选择任何内容,读取值将返回
Nothing
;如果未设置ValueMember,则返回选定对象本身;如果设置了ValueMember,则返回选定对象的相应属性值

到目前为止,代码工作得还不错

但是,最近对用于填充组合框的一个类进行了更改,如下所示:

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
Partial Public Class Modality
    <Browsable(False)>
    Public Property ModalityID As Integer
    Public Property ModalityName As String
    Public Property ModalityAbbrevName As String
End Class
部分公共类模态
公共属性ModalityID为整数
公共属性ModalityName作为字符串
公共属性ModalityAbbrevName作为字符串
末级
作为组合框的ValueMember使用的ModalityID属性添加了Browsable(False)属性,因此当模态对象集合绑定到应用程序中其他位置的DataGridView控件时,它不会显示为列

这会中断应用程序,因为myCombox1.Value现在返回选定的模态对象,而不是选定模态对象的ModalityID,即使组合框的ValueMember仍设置为“ModalityID”

深入研究.NET Framework的
ListControl.FilterItemOnProperty(对象项,字符串字段)
的源代码对我来说并没有什么启发


问题是,为什么向类属性添加
属性会阻止
FilterItemProperty()
正确检索属性的值?

从方法ListControl.FilterItemProperty方法(对象,字符串)的参数中,可以看到属性名称作为字符串(从ValueMemeber值给定)出现在那里

而且,我并没有使用Reflector,但我认为在该方法的内部创建了一个对象属性列表,并试图将给定的PropertyName作为字符串来查找

显然,正在BrowsableAttribute上创建一个独立的列表。若属性设置为False,则属性不会列出,也无法查找

因此,如果这个
属性只存在于一个类中,那么在您读取
SelectedValue
的代码中,只需从所选对象中读取一个
MobalityID

如果您有多个具有
属性的类,它们在
组合框中用作
ValueMemeber
,您需要考虑所用属性的名称,例如,您可以将它们全部命名为“ID”


如果可能的话,创建一个只有一个property.ID的接口,并将其实现到所有可浏览(False)类,然后为具有此接口的类创建泛型值属性。然后您可以直接从代码中获取ID属性。

您是否尝试编写一个简单的测试应用程序来验证是BrowsableAttribute导致了问题?可能还有另一个您不知道或忘记的修改。我还没有创建测试应用程序,但这是从昨天代码运行到今天代码不运行期间提交到源代码管理存储库的仅有两个更改之一(提交的另一个更改是提交到不相关的代码部分)。我通过从属性中删除
BrowsableAttribute
进一步验证了这一点,代码再次起作用。