2009-06-24 3 views
1

Eine Reihe von Dotnet-Framework-Komponenten verwenden eine DataSource-Komponente. Ich habe ein Objekt, das eine Reihe von Einstellungen hat, die die DataSource, die es darstellt, ändern können. Ich möchte dieses Objekt als DropDown-DataSource eines Satzes von ComboBoxen und DataGridViewComboBoxCells festlegen.Verwenden eines Objekts ohne Sammlung als DataSource

Mein Problem kommt, wenn ich versuche, das Ding tatsächlich in die ComboBox einzuhängen. Da die Änderungen an der DataSource passieren können, nachdem die DataSource festgelegt wurde, muss ich eines dieser BindingSource-Dinge verwenden, aber die MSDN-Literatur zieht ihren üblichen Streich und sagt mir, was eine bindingSource ist, ohne mir zu sagen, was sie tut oder wie es funktioniert.

Wie können Sie am besten vorschlagen, dieses Objekt als DataSource/BindingSource anzuhängen?

EDIT:
Offensichtlich ist diese Klasse Junk, aber es veranschaulicht die Art von Objekt, das ich jetzt habe.
Das meiste Timing ist momentan in der Luft, aber im Grunde zeigt das, dass meine Klasse selbst keine Sammlung ist, sondern eine solche enthält. Ich muss in der Lage sein, die DataSource-Eigenschaft einer ComboBox anzuweisen, dass hier eine flüchtige Liste zu finden ist, und dass sie diese Liste als DataSource für ihre Dropdown-Liste verwenden sollte.

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

Einige Beispielcode wäre nett :) – Josh

+0

Ich hatte gedacht, es war klar genug, aber ich denke, das ist, weil ich bereits weiß, was das Problem ist. ;) Ich werde etwas zusammenwerfen. – Frosty840

+0

(auf Kommentar antworten) –

Antwort

3

Kurzversion: verwenden BindingList<T> ...

Lange Version:

A DataSource ist in der Regel entweder:

  • ein individuelles Objekt (für einfache Bindung)
  • ein Liste Quelle (IListSource)
  • eine Liste (IList)

Da Sie es für ein Drop-down verwenden, es klingt wie Sie eine der beiden zweiten wollen, in der Regel IList (IListSource ist relativ selten, mit Ausnahme von DataTable).

Für Änderungen, sobald Sie gebunden haben, benötigen Sie Benachrichtigungen. Für einfache Bindungen (einzelne Objekte) sind entweder INotifyPropertyChanged oder *Changed Ereignisse die richtige Wahl - aber für Listen müssen Sie IBindingList implementieren und das Ereignis ListChanged auslösen, um dem Steuerelement mitzuteilen, was passiert ist.

Um ehrlich zu sein, das ist eine Menge nicht interessante Arbeit, die es sehr leicht macht, ein Durcheinander zu machen.

Der pragmatische Ansatz besteht darin, mit BindingList<T> zu arbeiten (möglicherweise davon zu erben). Dies gibt Ihnen alle Listenbenachrichtigungen, einschließlich der Unterstützung für Elemente in die Liste ändert sich, wenn Sie INotifyPropertyChanged für die Elemente implementieren (es unterstützt jedoch *Changed Ereignisse nicht).

Vorbehalt: nicht alle Kontrollen kümmern sich um Benachrichtigungen ... und wenn sie nicht tun, gibt es nicht viel, was Sie dagegen tun können. Also, wenn Sie nicht sehen, Ergänzungen/Swaps/etc auch bei der Verwendung BindingList<T> - oder Sie nicht sehen Artikel Updates bei der Implementierung INotifyPropertyChanged, dann ... äh, hart?

+0

Ah, iBindingList lebt in System.ComponentModel, die ich nicht direkt an Intellisense angeschlossen habe. Ich hatte iBindingSource angeschaut, was immer noch unverständlich erscheint und wahrscheinlich völlig unabhängig von dem ist, wonach ich suche. iBindingList ist eine Art Implementierung, die es zu füllen gilt, aber es ist * viel * mehr, wonach ich gesucht habe. Vielen Dank. Eine Sache, ich denke nicht, dass es ein iBindingEnumerable oder ähnliches gibt? Ich werde wahrscheinlich nur eine Menge inaktiver Funktionen in meiner iBindingList-Implementierung haben, so dass Leute nichts hinzufügen können, aber es wäre schön, ohne Listenmethoden auszukommen ... – Frosty840

+0

Nein, im Grunde genommen. ASP.NET kann mit IEnumerable <> 'auskommen, weil es nur einmal gelesen wird - aber alles andere möchte Daten mehrmals abrufen können, daher verwendet es den Indexer für IList. –

+0

Es könnte schlimmer sein - Sie müssen ITypedList; -p implementieren (was bedeutet, dass Sie Ihre eigenen PropertyDescriptors schreiben müssen ...) –