System.Windows.Forms.ComboBox から継承するカスタム ComboBox コントロールを作成しました。次のように記述した「値」プロパティがあります。
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
基本的に、Value を読み取ると、Nothing
何も選択されていない場合は値が返され、ValueMember が設定されていない場合は選択されたオブジェクト自体が返され、ValueMember が設定されている場合は選択されたオブジェクトの適切なプロパティ値が返されます。
この時点まで、コードは正常に機能しました。
ただし、最近、ComboBox の設定に使用されるクラスの 1 つが次のように変更されました。
Partial Public Class Modality
<Browsable(False)>
Public Property ModalityID As Integer
Public Property ModalityName As String
Public Property ModalityAbbrevName As String
End Class
ComboBox の ValueMember として使用される ModalityID プロパティには Browsable(False) 属性が追加されているため、Modality オブジェクトのコレクションがアプリケーションの別の場所で DataGridView コントロールにバインドされた場合、列として表示されません。
ComboBox の ValueMember がまだ "ModalityID" に設定されている場合でも、MyComboBox1.Value は選択された Modality オブジェクトを返し、選択された Modality オブジェクトの ModalityID を返さないため、これでアプリケーションが壊れます。
の .NET Framework のソース コードを掘り下げても、ListControl.FilterItemOnProperty(object item, string field)
私は啓発されません。
<Browsable(False)>
問題は、クラス プロパティに属性を追加するとFilterItemOnProperty()
、プロパティの値を適切に取得できなくなるのはなぜでしょうか。