Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie Array an ComboBox binden?
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

Wie Array an ComboBox binden?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
S.H.-Teichhof
myCSharp.de - Member

Avatar #avatar-2460.jpg


Dabei seit:
Beiträge: 1.549
Herkunft: Sindringen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

ä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?
private Nachricht | Beiträge des Benutzers
psirus
myCSharp.de - Member



Dabei seit:
Beiträge: 1

beantworten | zitieren | melden

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ß
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
el_panter
myCSharp.de - Member



Dabei seit:
Beiträge: 395
Herkunft: Sömmerda

beantworten | zitieren | melden

[offtopic] 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. [/offtopic]
MfG Paul
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3.331
Herkunft: Berlin

beantworten | zitieren | melden

@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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von juetho am .
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

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 .
private Nachricht | Beiträge des Benutzers
Kaji
myCSharp.de - Member



Dabei seit:
Beiträge: 593
Herkunft: Clausthal-Zellerfeld

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

Hallo Kaji,

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

Gruß
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

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;
        }
    }
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3.331
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

hey juetho, das leuchtet ein... wie kann ich dann aber DisplayMember und ValueMember bei meinem Array zuweisen? Gruß sp00ky
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

geht nicht.

warum hängste so an deinem Array?
Ist ein Array von KeyValuePair nicht gut?
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

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?!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von sp00ky am .
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

Hey Jiu Jitsu Juka,

in meinem Quellcode kommt die Zeile

this.bindingSource.DataSource

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

Gruß,
sp00ky
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
sp00ky
myCSharp.de - Member



Dabei seit:
Beiträge: 80
Herkunft: Germany, Dresden

Themenstarter:

beantworten | zitieren | melden

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")
};
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
JuyJuka
myCSharp.de - Experte

Avatar #avatar-2316.jpg


Dabei seit:
Beiträge: 2.187
Herkunft: Deutschland

beantworten | zitieren | melden

Hallo ErfinderDesRades, Hallo sp00ky,
Zitat von 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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers