2009-06-24 10 views
1

dotnetフレームワークコンポーネントの束はDataSourceコンポーネントを使用します。 私は、それが表すDataSourceを変更できるいくつかの設定を持つオブジェクトを持っています。私はComboBoxesとDataGridViewComboBoxCellsのセットのドロップダウンデータソースとしてこのオブジェクトを設定したいと思います。非コレクションオブジェクトをデータソースとして使用

私の問題は実際にコンボボックスに物事をフックしようとしているときに来る。 DataSourceが設定されると、DataSourceの変更が発生する可能性があるため、これらのBindingSourceのいずれかを使用する必要がありますが、MSDNの文献では、バインディングソースが何をしているのかわからなくても、またはそれがどのように機能するか。

このオブジェクトを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 
+0

いくつかのサンプルコードは素敵です:) – Josh

+0

私はそれが十分にはっきりしていると思っていましたが、私はすでに問題が何であるかを知っているからです。 ;)私は一緒に何かを投げるだろう。 – Frosty840

+0

(コメントに返信) –

答えて

3

ショートバージョン:BindingList<T> ...

を使用ロングバージョン:

DataSourceは、いずれかの一般的である:

  • (簡単な結合のための)個々のオブジェクト
  • Aリストソース(IListSource
  • リスト(IList

ドロップダウンのためにそれを使用しているので、あなたが次の二つのいずれかをしたいように、それは(IListSourceDataTableを除き、比較的まれである)、通常IList、聞こえます。

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

正直言って、これは非常に面白くない仕事の多くですが、それは非常に簡単です。

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

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

+0

ああ、iBindingListはSystem.ComponentModelにありますが、これはIntellisenseに直接フックされていません。 私はまだ理解できないように見えるiBindingSourceを見ていて、おそらく私が探しているものとは全く関係ありません。 iBindingListは、実装しなければならないことですが、探していたものよりもはるかに多くのものです。どうもありがとう。 しかし、私はそこにiBindingEnumerableなどがあるとは思わないでしょうか?おそらく私のiBindingListの実装にはたくさんの非アクティブな関数があるので、人々はものを追加することはできませんが、リストメソッドを使わないとうれしいでしょう。 – Frosty840

+0

いいえ、基本的にはありません。 ASP.NETはIEnumerable <>を使って行うことができます。なぜなら、それは一度だけ読み込まれるからです。しかし、他のものは何度もデータを取得したいので、IListのインデクサーを使用します。 –

+0

それは悪化する可能性があります - あなた自身のPropertyDescriptorsを書くことを含むITypedList; -pを実装しなければならないかもしれません... –

関連する問題