ListBox Datenbindung: Element anzeigen das nicht in DataSource ist

IamTheBug
Hi,

ich beschäftige mich erst seit kurzem mit dem Thema Datenbindung. Bisher klappt es mit Doku lesen und MSDN Beispielen sehr gut.
Allerdings stellt sich mir bisher noch eine Frage die ich nicht so lösen konte. Folgende Situation.

Ich habe eine DataSet. Darin befindet sich eine Tabelle "Kunde" mit der DataRow "Kundennummer" die unique ist.
Jetzt existiert im DataSet eine zweite Tabelle namens "Bestellungen" mit den Rows "name-der-bestellung", "Datum" und "Kundennummer".

Das ganze ist wie folgt gebunden.
Die Tabelle "Kunde" an eine ListBox so das mir die ListBox die Kundennnummern anzeigt (funktioniert).
Die Tabelle "Bestellungen" ist an ein DataGridView gebunden. (funktioniert)
Erste Spalte zeigt mit "name-der-bestellung", zweite das Datum. Die dritte Spalte ist jetzt eine ComboBox. Dort soll der Nutzer per Hand eine Kundennummer auswählen und der Bestellung hinzufügen (funktioniert).
Die Combox ist auch richtig gebunden so das alle Kundennummern in dieser Combox sind (funktioniert).

Jetzt das Problem. Wie bekomme ich in die Combobox einen zusätzlich Eintrag "nicht zugewiesen". So das man hinterher die Kundennummer aus der Zuweisung wieder entfernen kann. Ich könnte ja einfach der Tabelle "Kunde" einen Eintrag "nicht zugewiesen" hinzufügen. Aber in dem Moment wird mir der Eintrag auch in der ListBox angezeigt. Das ist ja nicht Sinn der Sache, denn so einen Kunden gibt es ja nicht.

Wie löst man das Problem?

Gruß und Danke
IamTheBug
Ist es der richtige Weg, wenn ich der Spalte deinen Eintrag "nicht zugewiesen" hinzufüge und dann bei der ListBox mit einem Filter arbeite der mir alles anzeigt ausser "nicht zugewiesen"?
Oder ist das nur eine "Krücken-Lösung"?

edit: funktionieren tut das für die ListBox allerdings schlägt der Filter dann auch bei der ComboBox im DataGridView durch :/
So das dieses Element in der Tabelle vorhanden ist aber tortzdem bei beidem nicht angezeigt wird...
Th69
Hallo,

ja, könntest du so machen - nimm für das Filtern dann DataView oder BindingList.

Eine andere Möglichkeit, die mir einfällt, wäre das Hinzufügen einer 4. Spalte mit einem Button "nicht zugewiesen" und dieser setzt dann den Value auf null.

Edit: Wie hast du den Filter denn gesetzt?
IamTheBug
ich habe das wie folgt gelöst:

Die Bindung an die Combobox im DataGridView:

C#-Code:
((System.Windows.Forms.DataGridViewComboBoxColumn)dataGridView.Columns[3]).DataSource = myTableKunde;
            ((System.Windows.Forms.DataGridViewComboBoxColumn)dataGridView.Columns[3]).DisplayMember = myTableKunde.Columns[0].ColumnName;

Somit wird mir schön in der Combobox alles angezeigt was in der Tabelle Kunden unter Row Kundennummer steht.

Gebunden habe ich die ListBox zuerst so:

C#-Code:
this.listBox.DataSource = myTableKunde;
this.listBox.DisplayMember = myTableKunde.Columns[0].ColumnName;

Somit wurde mir auch da alles angezeigt. Das habe ich jetzt in das geändert:

C#-Code:
BindingSource source1 = new BindingSource();
source1.DataSource = myTableKunde;
this.listBox.DataSource = source1;
this.listBox.DisplayMember = myTableKunde.Columns[0].ColumnName;
source1.Filter = "Kundennummer <> 'keineNummer'";

Es wurden dann einträge hinzugefügt und auch der spezielle Eintrag "keineNummer".
Jetzt filtert er den Eintrag "keineNummer" aber das tut er in der listBox und auch in der Combobox.


edit:

ich glaube ich habe es hinbekommen.
Ich habe einach dem DataSource ein neutrales Element hinzugefügt z.B. "nicht zugewiesen".

Anschliessend erzeuge ich einen

C#-Code:
DataView view = new DataView(myTableKunde);

Dem vepasse ich einen Filter und binde das View an die Listbox.

Danach erstelle ich einen zweiten View:

C#-Code:
DataView view2 = new DataView(myTableKunde);

ohne Filter und binde das an die ComboBox.
So klappt es.

Wenn es elegantere und sinnvollere Lösungen gibt bin ich dafür offen.
Ich muss dann eben nur eine "Pseudo-Kundennummer" mitführen die so nie vergeben werden darf.
herbivore
Hallo IamTheBug,

das Hinzufügen und spätere Herausfiltern an anderer Stelle gefällt mir nicht, nicht nur deshalb, weil das nicht DRY ist.

Ich würde an deiner Stelle eine eigene BindingList schreiben, die intern zwei BindingListen benutzt, eine für die eigentlichen Werte und eine für die zusätzlichen Werte. So eine Art Wrapper für die originale BindingList. So ähnlich wie eine ReadOnlyCollection ein Wrapper für die originale Liste ist, nur eben dass du das für zwei Listen und nicht readonly machst. :-) Wenn man es ganz komfortabel haben will, dann macht es konfigurierbar, ob die Zusatzwerte am Anfang oder am Ende stehen oder einsortiert werden sollen. Wo du den zusätzlichen Wert brauchst, bindest die neue BindingList (den Wrapper), wo du ihn nicht brauchst, bindest du die originale BindingList. Änderungen an dem Original sollten dann vollkommen transparent auf den Wrapper durchschlagen und umgekehrt.

herbivore
IamTheBug
Ok,

danke für die Hinweise.
Mein weg mit den unterschiedlichen DataViews ist eigentlich sehr schnell und einfach umzusetzen.
Ich probiere das aber auch mal mittels Wrapper. Ein wenig Übung und Nachdenken kann ja nicht schaden :)