Laden...

Wie Array an ComboBox binden?

Erstellt von sp00ky vor 14 Jahren Letzter Beitrag vor 14 Jahren 11.371 Views
Thema geschlossen
S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren
Wie Array an ComboBox binden?

Hallo!

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!

Gruß Ronny

1.549 Beiträge seit 2004
vor 14 Jahren

direkt binden kannst du es nicht, aber du kannst in der Combobox den gleichen index wie in einem array mit den anderen bezeichnungen.

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

ä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?

momentan habe ich

cbox_gender.Items.AddRange(new string[]{"männlich", "weiblich"}); 

wie kann ich jetzt für männlich m und bei weiblich w zurückgeben lassen?

P
1 Beiträge seit 2009
vor 14 Jahren

Hallo,
das kannst du mit einer DataTable machen.


// 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();

Viel Spaß

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo @All,

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).

Gruß
Juy Juka

5.299 Beiträge seit 2008
vor 14 Jahren

Also für so zweiwertige Sachen ist doch eigentlich der bool erfunden worden?
Der Mensch ist weiblich oder nicht.

Wäre also eher Sache einer Checkbox, und inne DB ein Bit.

Für mehrwertige Sachen evtl. Integer nehmen. Da kann man dann einfach den SelectedIndex in die DB speichern.

Naja, evtl. fühlen sich Männer angepiselt, wennse ihr Geschlecht angeben müssen, indem sie nurne Checkbox grade nicht klicken.

Dann eben doch die Combo, und in die DB wandert 0 oder 1, (der SelectedIndex).

Der frühe Apfel fängt den Wurm.

E
395 Beiträge seit 2007
vor 14 Jahren

hi ErfinderDesRades

nicht ganz. wenn mann zumbeispiel bei einer Anmeldung nicht zwingend vorschreibt das man das Geschlecht angeben soll so sind es 3 zustände.

MfG Paul

J
3.331 Beiträge seit 2006
vor 14 Jahren

@psirus
Hier gilt Wie poste ich richtig? Punkt 2 Keine Doppel-Posts

Bitte unterstütze dieses unhöfliche Verhalten nicht dadurch, dass du deine Antwort ebenfalls doppelt gibst.

Natürlich sollte auch sp00ky das künftig beachten.

Danke schön! Jürgen

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

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... 😉

K
593 Beiträge seit 2007
vor 14 Jahren

Hallo sp00ky,

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.

Gruß Kaji

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Hallo Kaji,

gut dann akzeptiere ich das so und werde wie gesagt immer zuerst hier posten. Thx anyway...

Gruß

5.299 Beiträge seit 2008
vor 14 Jahren

so, jetzt also Array an Combo binden:

using System;
using System.Data;
using System.Windows.Forms;

using kvp = System.Collections.Generic.KeyValuePair<string, string>;

namespace FilebrowserTest {
   public partial class Form2 : Form {

      private kvp[] cmbSrc = new kvp[] { 
         new kvp("m", "männlich"), new kvp("w", "weiblich"), new kvp("k", "keine Ahnung") };

      public Form2() {
         InitializeComponent();
         comboBox1.DisplayMember = "Value";
         comboBox1.ValueMember = "Key";
         comboBox1.DataSource = cmbSrc;
      }

      private string Zugriff() {
         return cmbSrc[comboBox1.SelectedIndex].Key;
         //oder
         return cmbSrc[comboBox1.SelectedIndex].Value;
      }
            
   }
}

Der frühe Apfel fängt den Wurm.

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

hatte es jetzt gerade so gemacht, aber irgendwie funzt es nicht, die combobox ist leer... warum?


    public partial class Form1 : Form
    {
        string[,] arr_gender = new string[,] {
                { "m", "männlich" },
                { "w", "weiblich" },
                { "na", "weiß man nicht" }};

        public Form1()
        {
            InitializeComponent();
            comboBox1.DisplayMember = "Value";
            comboBox1.ValueMember = "Key";
            comboBox1.DataSource = arr_gender;
        }
    }

J
3.331 Beiträge seit 2006
vor 14 Jahren

Fällt dir der Unterschied zwischen den beiden letzten Lösungen auf?

ErfinderDesRades benutzt KeyValuePair. Hier sind die Member "Key" und "Value" bekannt.

Du benutzt ein zweidimensionales Array. Dort gibt es die Begriffe "Key" und "Value" überhaupt nicht.

Was erwartest du also, was NET damit anfangen soll?

Jürgen

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

hey juetho, das leuchtet ein... wie kann ich dann aber DisplayMember und ValueMember bei meinem Array zuweisen? Gruß sp00ky

5.299 Beiträge seit 2008
vor 14 Jahren

geht nicht.

warum hängste so an _**deinem **_Array?
Ist ein Array von KeyValuePair nicht gut?

Der frühe Apfel fängt den Wurm.

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo spopkey,

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).

Gruß
Juy Juka

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Na hängen tue ich nicht dran, will nur dazu lernen und verstehen wie das gehen würde. Habs jetzt auch mit KeyValuePair gemacht. Vielen Dank dafür...

PS: Warum kann ich das KeyValuePair nicht im Designer an die combobox hängen, sondern nur per Quellcode?

//Edit: Würde es ja gern im designer anbinden aber das KeyValuePair taucht unter Objekten nicht auf?!

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo sp00key,

im Designer kann man auch KeyValuePair binden (über BindingSource), man muss Ihm nur mit den Generics (was er nicht kann) auf die Sprünge helfen.

Man sucht die Zeile:

this.bindingSource.DataSource = 

Und ersetzt Sie:

this.bindingSource.DataSource = typeof(System.Collection.Generics.KeyValuePair<string,string>);

(oder ähnlichem)

Ab dann kann der Designer wieder alles von alleine.

Gruß
Juy Juka

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Hey Jiu Jitsu Juka,

in meinem Quellcode kommt die Zeile

this.bindingSource.DataSource

aber nicht vor... Wo soll ich sie denn suchen???

Gruß,
sp00ky

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo sp00ky,

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(..."

Gruß
Juy Juka

S
sp00ky Themenstarter:in
80 Beiträge seit 2008
vor 14 Jahren

Das sind ja Tweaks hier... aber funzt!

Habe jetz in Form1.Designer folgendes...


this.bindingSource1.DataSource = typeof(System.Collections.Generic.KeyValuePair<string, string>); //war bei Dir nen kleiner Screibfehler drin

this.cbox_vdi7.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.bindingSource1, "Value", true));
this.cbox_vdi7.DataSource = this.bindingSource1;
this.cbox_vdi7.DisplayMember = "Key";
this.cbox_vdi7.ValueMember = "Value";

Aber wie bekomme ich da jetzt meine Daten rein???


private kvp[] cmbSrc = new kvp[] {
new kvp("m", "männlich"),
new kvp("w", "weiblich"),
new kvp("k", "keine Ahnung")
};

5.299 Beiträge seit 2008
vor 14 Jahren
this.bindingSource1.Add(new kvp("m", "männlich"));
//...

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;)

Der frühe Apfel fängt den Wurm.

2.187 Beiträge seit 2005
vor 14 Jahren

Hallo ErfinderDesRades, Hallo sp00ky,

war bei Dir nen kleiner Screibfehler drin

Kann passieren. 😉

@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.

Gruß
Juy Juka

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo sp00ky,

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.

herbivore

Thema geschlossen