我写过一个继承自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()
正确检索属性的值?
您是否试过编写一个简单的测试应用程序来验证它是导致问题的BrowsableAttribute?也许还有另外一个你没有意识到或忘记的修改。 – 2013-03-15 21:58:54
我还没有创建一个测试应用程序,但是这是在代码昨天工作和今天工作不正常的时候提交给源代码控制库的两个更改之一(提交的另一个更改是无关的代码段)。我通过从属性中移除了'BrowsableAttribute'进一步验证了它,并且代码再次运行。 – MCattle 2013-03-15 22:15:49