2013-03-15 24 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的属性。