1

多数の dotnet フレームワーク コンポーネントが DataSource コンポーネントを使用します。それが表す DataSource を変更できる多くの設定を持つオブジェクトがあります。このオブジェクトを ComboBoxes と DataGridViewComboBoxCells のセットのドロップダウン DataSource として設定したいと思います。

私の問題は、実際に物を ComboBox にフックしようとしたときに発生します。DataSource が設定されると、DataSource への変更が発生する可能性があるため、これらの BindingSource のいずれかを使用する必要があると思いますが、MSDN の資料では、bindingSource が何をするのかを説明せずに、バインディングソースが何であるかを伝えるといういつものいたずらを引っ張っています。またはそれがどのように機能するか。

このオブジェクトを DataSource/BindingSource として接続するために提案できる最善の方法は何ですか?

編集:
明らかにこのクラスはジャンクですが、私が今持っているオブジェクトの種類を示しています。
現時点ではほとんどのタイミングが未定ですが、基本的にこれが示しているのは、私のクラスはコレクション自体ではなく、コレクションを含んでいるということです。ComboBox の DataSource プロパティに、揮発性のリストがここにあり、そのリストをドロップダウンの DataSource として使用する必要があることを指示できる必要があります。

Public Class DynamicDataSource
    Private basicList As New List(Of String)(New String() {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten"})
    Private _showEvensOnly As Boolean
    Private _showNotContainingO As Boolean
    Public Property ShowEvensOnly() As Boolean
        Get
            Return _showEvensOnly
        End Get
        Set(ByVal value As Boolean)
            _showEvensOnly = value
        End Set
    End Property
    Public Property ShowNotContainingO() As Boolean
        Get
            Return _showNotContainingO
        End Get
        Set(ByVal value As Boolean)
            _showNotContainingO = value
        End Set
    End Property
    Public Function GetDynamicList() As List(Of String)
        Dim processMe As New List(Of String)(basicList)
        If Me._showEvensOnly Then
            For JJ As Integer = processMe.Count - 1 To 0 Step -1
                If JJ Mod 2 = 0 Then
                    processMe.Remove(processMe(JJ))
                End If
            Next
        End If

        If Me._showNotContainingO Then
            For JJ As Integer = processMe.Count - 1 To 0 Step -1
                If processMe(JJ).ToUpper.Contains("O"c) Then
                    processMe.Remove(processMe(JJ))
                End If
            Next
        End If

        Return processMe
    End Function
End Class
4

1 に答える 1

3

短いバージョン:使用BindingList<T>...

ロングバージョン:

ADataSourceは通常、次のいずれかです。

  • 個々のオブジェクト(単純なバインディング用)
  • リストソース(IListSource
  • リスト(IList

ドロップダウンに使用しているため、通常は2番目の2つのうちの1つが必要なようですIListIListSourceを除いて、比較的まれですDataTable)。

バインドした後の変更については、通知が必要です。単純なバインディング(個々のオブジェクト)の場合は、INotifyPropertyChangedまたは*Changedイベントのいずれかを実行する方法ですが、リストの場合は、イベントを実装IBindingListして発生さListChangedせ、コントロールに何が起こったかを通知する必要があります。

正直なところ、これは面白くない作業がたくさんあり、混乱させるのは非常に簡単です。

実用的なアプローチは、BindingList<T>(おそらくそれから継承して)作業することです。これにより、アイテムに実装した場合に変更されるリストのアイテムのサポートを含む、すべてのリスト通知が提供されます(ただし、イベントINotifyPropertyChangedはサポートされません)。*Changed

警告:すべてのコントロールが通知を気にするわけではありません...そして、通知がない場合は、それについてできることはあまりありません。したがって、使用しても追加/スワップなどが表示されない場合、BindingList<T>または実装時にアイテムの更新が表示されない場合はINotifyPropertyChanged、...えー、難しいですか?

于 2009-06-24T12:20:03.413 に答える