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
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
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
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.))
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:
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.
Wäre super, wenn Du mir nochmal helfen könntest. Tausend Dank aber schonmal soweit 🙂
Gruß,
M.Konrad
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
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
Hi juetho,
danke für den Tip. Das sollte eigentlich so funktionieren.
Gruß,
MKonrad