Ich habe ein paar ComboBoxen anhand deren Auswahl ich eine SQL Abfrage losschicken möchte. Momentan habe ich die ComboBoxen mit AddRange gefüllt. Wie kann ich zu den Auswahlfeldern einen Rückgabewert bzw Index definieren den ich dann direkt in der SQL Abfrage verwenden kann? zB ("m", "männlich"), ("w", "weiblich") Im moment kann ich nur männlich und weiblich verwenden, bessere wäre aber als Rückgabewert m oder w! Normalerweise sollte das doch mit einem Array funktionieren, aber wie binde ich den korrekt an so eine ComboBox an? Vielen Dank im Voraus!
ähm das habe ich jetzt nicht ganz verstanden? den array brauch ich ja eigentlich nicht, wenn ich in der combobox die indexe selbst definieren kann... aber wie mache ich das?
// DataTable erzeugen
DataTable dt = new DataTable();
// der DataTable 2 Spalten hinzufügen.
dt.Columns.Add(new DataColumn("long")); // lange beschreibung, die angezeigt werden soll
dt.Columns.Add(new DataColumn("short")); // kurze beschreibung, die ausgewertet werden soll
// die Zeilen (Werte) hinzufügen. Die Reihenfolge beim "Add" entsprechend der Spalten
dt.Rows.Add("weiblich", "w");
dt.Rows.Add("männlich", "m");
// der ComboBox als Datenquelle die Datatable zuweisen.
comboBox1.DataSource = dt;
// als Anzeigespalte die lange Beschreibung verwenden
comboBox1.DisplayMember = "long";
// als Wert zur Auswertung die kure Berschreibung verwenden
comboBox1.ValueMember = "short";
// Auf das ausgewählte Element zugreifen
comboBox1.SelectedValue.ToString();
Natürlich kann man ein Array binden. Am einfachsten geht es über eine BindingSource:
1. BindingSource anlegen .
2. ComboBox über Designer binden.
3. Wert im Quellcode DataSource.BindingSource zuordnen.
4. Im Quellcode auf die BindingSource zugreifen.
Ausführlich:
1. Der BindingSource im Desiger als DataSource den Typ des Arrays geben (also z.B. System.String wenn man ein string[]) das geht am einfachsten über den Dialog zum anlegen von Datenquellen.
2. Im Quellcode dann dem DataSource-Property der BindingSource die eigentlichen Werte zuweisen.
3. Die ComboBox kann dann per Designer gebunden werden.
4. Im Quellcode wird nur noch über die BindingSource gearbeitet (z.B. Position oder Current).
Über den Quellcode gibts auch noch eine ander nicht ganz so elegante Methode:
1. ComboBox.DataSource das Array zuweisen.
2. ComboBox.DisplayMember setzen.
3. ComboBox.ValueMember setzen.
4. Über ComboBox zugreifen (SelectedValue, SelectedItem)
(Dies ist nicht zu empfehlen).
nicht ganz. wenn mann zumbeispiel bei einer Anmeldung nicht zwingend vorschreibt das man das Geschlecht angeben soll so sind es 3 zustände.
[/offtopic]
Moin! Vielen Dank für die zahlreichen Antworten...
@psirus & JuyJuka: Werde das gleich mal ausprobieren, das ist genau das was ich gesucht habe.
@ErfinderDesRades: Nicht an dem m/w hochziehen, dass war nur ein Beispiel. Die DB ist wesentlich komplexer...
@juetho: Ganz langsam Jürgen... ich kenne die Regeln! Aber mycsharp.de und c-sharp-forum.de sind zwei verschiedene Foren und da ist das wohl egal oder? Da hier aber wesentlich mehr Feedback zu Stande kam, werde ich Zukunft natürlich nur noch hier posten... ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von sp00ky am .
das sieht du leider Falsch. Wie in dem oben genannten Thread Punkt 2 gelten Doppel posts auch und vorallem auch in anderen Foren. Es geht darum das sich die Leute aus den verschiedenen Foren unnötig gedanken machen, da es das andere Forum schon getan hat und bzw schon geantwortet hat. Daher sollte man jeweils nur in einem Forum posten. Natürlich kannst du wenn nach ein paar Tage z.b. keine Antwort in dem einen Forum kam in dem anderen einen Post machen.
vielleicht war es noch nicht groß genug geschrieben, aber die Variante direkt über die ComboBox ist die schlechtere von beiden!!
Benutz doch bie BindingSource (egal ob mit dem VisualStudio-Designer oder ohne).
Hier mal mein ultra geheimer super Trick:
1. Geh in den Designer und wähle die BindingSource aus.
2. Trage in das Property "Filter" der Bindingsorce a ein.
3. Gehe in die *.designer.cs
4. Suche in der *.designer.cs nach "a" (mit anführungszeichen)
5. Ersetze die Zeile "this.bindingSource.Filter" gegen die Zeile "this.bindingSource.DataSource = typeof(..."
Ich sehe nurnicht, dasses in diesem Falle besser ist.
wenigstens isses umständlicher, und braucht die größere Ressource.
Und man kann nicht typisiert zugreifen(string cmbSrc[comboBox1.SelectedIndex].Key;)
@ErfinderDesRades: Es ist besser, da man nicht auf die ComboBox zugreifen muss. Man kann die ComboBox locker flockig gegen ein DataGridView oder eine ListBox. Außerdem hat man so eine einfachere "Schnittstelle", wenn mehrer Controls auf die gleiche Datenquelle zugreifen (z.B. ComboBox für's auswählen eines Objektes und TextBox-Objekte zum bearbeiten des Ausgewählten.).
Und vor allem: Man kann alles über den Designer machen und muss nicht noch eine menge Code schreiben, bei dem man viele Fehler machen kann (*schnief* wieso gibt's keinen propertyof-Operator), da das der Designer übernimmt.
leider war ich gestern verhindert und habe dadurch den Thread erst jetzt gesehen. Auch und gerade, wenn du [Hinweis] Wie poste ich richtig? Punkt 2.2 akzeptierst, habe ich das dort Gesagte ungesetzt und den Thread geschlossen. Immerhin hat sich durch das späte Schließen gezeigt, dass du hier wirklich schnellere und bessere Antworten bekommst.