Laden...

SortedList ComboBox ID DataBinding Problem

Erstellt von MKonrad vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.639 Views
M
MKonrad Themenstarter:in
33 Beiträge seit 2007
vor 15 Jahren
SortedList ComboBox ID DataBinding Problem

Hallo Leute,

ich bin mal wieder am verzweifeln und wende mich an Euch, da Ihr mir bisher schon so genial geholfen habt. Vielen Dank dafür an dieser Stelle 🙂

Nun zu meinem Problem:

Ich habe eine Klasse Kunde angelegt und dieser Kunde besitzt Workstations. Diese werden innerhalb der Klasse in einer ArrayList gespeichert. Am Anfang funktionierte die Nummernvergabe einwandfrei. Workstation1- Nr 01, Workstation2- Nr 02 usw.
Das Problem entsteht jetzt, sobald man einen oder mehrere Workstations löscht. Sagen wir ich habe Nummern von 1-3 und lösche die Nr2. Nun habe ich in der ArrayList an Position 0 die Nr1 und an der Position 1 die Nr3. Jetzt möchte ich, dass beim Neuanlegen einer Workstation, die freie Nummer (also die Nr2) wieder belegt wird.
Ich habe mich entschieden, die ArrayList aufzugeben und stattdessen eine SortedList mit KeyValuePair zu benutzen. Zusätzlich habe ich mir eine Methode geschrieben, die sich immer die nächste freie Nummer automatisch sucht und vergibt. Bsp. Es gibt Nr1 und Nr3. Ich lege eine Workstation an und diese bekommt dann automatisch die Nr2. Bei der nächsten wäre es dann die Nr4 usw.
Soweit funktioniert das gut, allerdings möchte ich die Workstations in eine ComboBox einlesen. Das hatte ich vorher so geregelt, dass der Index der ComboBox dem Index der ArrayList entspricht und ich so auf das Objekt zugreifen konnte. Leider funktioniert das jetzt nicht mehr mit der SortedList 😦
Ich habe ein DataBinding mit der ComboBox hinbekommen, allerdings zeigt er immer nur den Namen des Objekts an. Ich würde dort natürlich gerne Werte von Properties der Klasse anzeigen wie z.B. pc-mueller. Desweiteren weiss ich nicht, ob DataBinding in diesem Fall richtig ist, da ich auch eine Option mit dem Namen "kein" brauche, falls ich keine Workstation zuordnen möchte.

So das wars. Ich freue mich über jeden Tip.

Vielen Dank im voraus!

Gruß,
M.Konrad

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Das Problem hatte ich auch schon. Ich habe dann anstadt auf SortedList das DataBinding zu machen auf SortedList.Values (oder so) gebunden. Dadurch komme ich wieder an alle Properties der Objekte. Da ich aber keine Funktion der SortedList genutzt habe (die kamm von einem Kollegen), kann ich nicht sagen, ob es sich dann nicht ein klein bischen anders verhält.

Gruß
Juy Juka

M
MKonrad Themenstarter:in
33 Beiträge seit 2007
vor 15 Jahren

Hi JuyJuka,

danke erstmal für Deine Antwort.

Leider verstehe ich nicht ganz, wie ich das dann genau im Code machen muss.
Mein Code beim Befüllen der ComboBox sieht so aus:


                ArrayList ComboList = new ArrayList();

                foreach (KeyValuePair<int, cWorkstation> kvp in kunde.Workstations)
                {
                    ComboList.Add(kvp.Value);
                }

                cmbTodoGeraet.DataSource = ComboList;
                cmbTodoGeraet.DisplayMember = "Value";
                cmbTodoGeraet.ValueMember = "Key";

Ist meine Vorgehensweise falsch? Den Umweg über die ArrayList habe ich aus einem Beitrag hier aus dem Forum. Ich bin nicht sicher, ob ich das machen muss.

Gruß,
M.Konrad

2.187 Beiträge seit 2005
vor 15 Jahren

Hi,

Du kannst es so machen, doch es wäre einfacher, wenn du auf "Daten->Neue Datenquelle hinzufügen..." gehst, in dem Dialog "Objekt" auswählst und auf der zweiten Seite deine "cWorkstation"-Klasse.

Dann kannst du im Eigenschaften/Properties Fenster der Combobox (im Designer) diese Datenquelle für DataSource auswählen (ganz ohne Code). Den DisplayMember und den ValueMember kannst du dann ganz bequem auch im Designer auswählen.
Jetzt muss nur noch im Konstruktor oder in der Form_Load folgende Zeile Code geschrieben werden:


this.cWorkstationBindingSource.DataSource = kunde.Workstations.Values;

Rein in Code sähe es wie folgt aus:


cmbTodoGeraet.DataSource = kunde.Workstations.Values;
cmbTodoGeraet.DisplayMember = "AnZuZeigendesProperty";

Und auf deine Workstation könntest du wie folgt zugreifen:


cWorkstation currentWorkstation = cmbTodoGeraet.SelectedValue as cWorkstation;

Gruß
Juy Juka

((PS: Es gibt Namenskonventionen für Klassen: Beginnen nicht mit c und werden immer Groß geschrieben.))

M
MKonrad Themenstarter:in
33 Beiträge seit 2007
vor 15 Jahren

Hi,

endlich mal jemand der mir erklären kann, wie das mit dem DataBinding im Designer geht. Ich hab mich danach schon totgesucht und nix gefunden. Danke 🙂

Es funktioniert auf jeden Fall schonmal so wie Du es beschrieben hast, allerdings habe ich noch 2 kleine Probleme:

  1. wie kann ich die Zeile

this.cWorkstationBindingSource.DataSource = kunde.Workstations.Values;

in welchen Konstruktor einbinden? In meiner Workstation-Klasse ist die cWorkstationBindingSource nicht bekannt. Wenn ich es in Form_Load mache funktioniert es einwandfrei.

  1. Ist es auch möglich, ein DisplayMember aus verschiedenen Properties zusammenzusetzen? Denn ich habe das Problem, dass die Workstation.Name beim Auswählen teilweise nicht sehr aussagekräftig ist wie z.B. "pc2". Ich hätte gerne eine Kombination aus dem Workstationnamen und dem Bediener z.B. "pc2 - M.Mueller". Ist es also machbar als DisplayMember einen generierten String in der ComboBox anzeigen zu lassen?

Wäre super, wenn Du mir nochmal helfen könntest. Tausend Dank aber schonmal soweit 🙂

Gruß,
M.Konrad

J
3.331 Beiträge seit 2006
vor 15 Jahren

Zu 2) Das geht direkt nicht. Eine mögliche Lösung ist Multi Column ComboBox.

Eine andere Lösung wäre über eine "berechnete Spalte" einer DataTable. Da Du aber sowieso Deine eigene Klasse hast, kannst Du doch einfach eine solche "berechnete Eigenschaft" hinzufügen und diese auswählen.

Jürgen

2.187 Beiträge seit 2005
vor 15 Jahren

Hallo MKonrad,

endlich mal jemand der mir erklären kann, wie das mit dem DataBinding im Designer geht. Ich hab mich danach schon totgesucht und nix gefunden. Danke 🙂

Ging mir genauso, ich bin noch kein experte mit DataBinding, aber ich helfe gern so weit wie möglich.

Gruß
Juy Juka

M
MKonrad Themenstarter:in
33 Beiträge seit 2007
vor 15 Jahren

Hi juetho,

danke für den Tip. Das sollte eigentlich so funktionieren.

Gruß,
MKonrad