0

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()、プロパティの値を適切に取得できなくなるのはなぜでしょうか。

4

1 に答える 1

1

メソッド ListControl.FilterItemOnProperty メソッド (オブジェクト、文字列) のパラメーターから、プロパティ名が文字列 (ValueMemeber 値から与えられる) としてそこにあることがわかります。

そして、私はリフレクターを使用していませんが、メソッド内でオブジェクトのプロパティのリストが作成され、指定された PropertyName を文字列として検索しようとしていると思います。

明らかに、BrowsableAttribute に依存しないリストを作成します。また、属性が False プロパティに設定されている場合、リストに表示されず、見つけることができません。

したがって、この<Browsable(False)>プロパティが 1 つのクラスのみにある場合は、 を読み取るコードで、選択したオブジェクトからSelectedValuea を読み取るだけです。MobalityID

<Browsable(False)>使用されるプロパティを持つ複数のクラスがある場合は、使用されるプロパティの名前ValueMemeberComboBox考える必要があります。たとえば、それらすべてに「ID」という名前を付けることができます。

可能であれば、プロパティ .ID を 1 つだけ持つ Inerface を作成し、それをすべての Browsable(False) クラスに実装してから、この Interface を持つクラスのジェネリック Value プロパティを作成します。次に、ID のプロパティをコードから直接取得できます。

于 2013-03-16T07:35:37.240 に答える