Laden...

ComboBox SelectedValue auslesen

Erstellt von med vor 13 Jahren Letzter Beitrag vor 13 Jahren 11.373 Views
M
med Themenstarter:in
103 Beiträge seit 2008
vor 13 Jahren
ComboBox SelectedValue auslesen

Hallo zusammen

Ich habe eine ComboBox, welcher ich eine DataSouce zugeordnet habe. Nun möchte ich im Event _SelectedIndexChanged den Wert aus SelectedValue auslesen, was mir jedoch nicht gelingen will...

Beim Debbugen kann ich das Objekt grafisch soweit "aufklappen" bis ich den Wert sehen kann.
--> CBox - SelectedItem - Row - ItemArray - [0] 122

Den Wert 122 möchte ich nun auslesen. Kann mir jemand einen Tipp abgeben?

Besten Dank!
med

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo med,

hast du auch etwas Code wie du es momentan versucht hast.
Normalerweise genügt im OnSelectedIndexChanged das SelectedItem ausliest. Denn diesen beinhaltet normalerweise das kürzlich ausgewählte Element. Da dies vom Typ Object ist musst du es noch in deinen gewünschten Datentyp casten.

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

5.299 Beiträge seit 2008
vor 13 Jahren

Beim Debbugen kann ich das Objekt grafisch soweit "aufklappen" bis ich den Wert sehen kann.
--> CBox - SelectedItem - Row - ItemArray - [0] 122

Lügst du uns auch nicht an? 😉
bei mir ist das SelectedItem immer ein DataRowView.

Das hat eine Row-Property. Und die Row kannst du casten auf den Typ deiner typisierten DataRow (ich hoffe, du verwendest ein typisiertes Dataset). Angenommen also, deine DataTable hieße "DateTimes":


      private void dateTime3ComboBox_SelectedIndexChanged(object sender, EventArgs e) {
         var cmb = (ComboBox)sender;
         var rw = (DateTimesDataSet.DateTimesRow)((DataRowView)cmb.SelectedItem).Row;
         var time3 = rw.DateTime3;
      }

Achso - warum möchtest du den Wert auslesen? Wenn das nämlich ein Schlüsselwert ist, und du davon abhängige Daten anzeigen möchtest, dann würde man ganz anders vorgehen.

Der frühe Apfel fängt den Wurm.

M
med Themenstarter:in
103 Beiträge seit 2008
vor 13 Jahren

Hallo zusammen

Ich inizialisiere die ComboBox wie folgt:


DataTable dtUsr = new DataTable();
dtUsr = this.dbq.GetT_User();
cBoxUserSwitch.DataSource = dtUsr;
cBoxUserSwitch.ValueMember = "ID";
cBoxUserSwitch.DisplayMember = "LoginName";
cBoxUserSwitch.SelectedValue = this.actUser.UserID;

Wir die ComboBox nun geändert möchte ich die gewählte UserID im SelectedValue auslesen, da ich mit dieser dann die Userinformationen laden will.

@ErfinderDesRades: Was meinst du mit: "dann würde man ganz anders vorgehen"?

Vielen Dank!
med

5.299 Beiträge seit 2008
vor 13 Jahren

Hi!

geht nicht auch


var dtUsr = this.dbq.GetT_User();
cBoxUserSwitch.DataSource = dtUsr;
cBoxUserSwitch.DisplayMember = "LoginName";
cBoxUserSwitch.ValueMember = "ID";
cBoxUserSwitch.SelectedValue = this.actUser.UserID;

und dann im SelectedIndexChanged:


var rwChoosenUser=dtUsr[cBoxUserSwitch.SelectedIndex];
var choosenID=rwChoosenUser.ID;

Äh - dtUsr müsste eine Klassenvar sein, damit sie sowohl beim Initialisieren als auch beim SelectedIndexChanged zugreifbar ist

Spasseshalber kannst du auch Vorüberlegung zur Form2Form mal angugge, die BeispielSolution

Der frühe Apfel fängt den Wurm.

M
med Themenstarter:in
103 Beiträge seit 2008
vor 13 Jahren

Hallo zusammen

Ich kam bis jetzt leider noch zu keiner Lösung. Schön wäre z.B., wenn ich folgendes anwenden könnte:


private void cBoxUserSwitch_SelectedIndexChanged(object sender, EventArgs e) {
         Int16 UID = 0;
         var cb = (ComboBox)sender;
         UID = (Int16)cb.SelectedValue;

Doch dies wirft mir eine cast Exception in der letzten Zeile. Ich könnte einfach cb.Text verwenden, damit käme ich auch zum Ziel... Aber ist irgendwie nicht befriedigend. Was meint Ihr?

Besten Dank!

R
158 Beiträge seit 2007
vor 13 Jahren

...Doch dies wirft mir eine cast Exception in der letzten Zeile....

So sollte es richtig gecastet werden:


UID = Convert.ToInt16(cb.SelectedValue);

M
med Themenstarter:in
103 Beiträge seit 2008
vor 13 Jahren

Beim Initialisieren der ComboBox wird der Event SelectedIndexChanged ausgelöst, in diesem Falle klappt es folgendermassen:


dtUsr = this.dbq.GetT_User();
cBoxUserSwitch.DataSource = dtUsr;   //löst Event aus

private void cBoxUserSwitch_SelectedIndexChanged(object sender, EventArgs e) {
         Int16 UID = 0;
         ComboBox cb = (ComboBox)sender;
         DataRowView drv = (DataRowView)cb.SelectedValue;
         UID = Convert.ToInt16(drv.Row["ID"]);

Wenn die ComboBox danach durch den User geändert wird erhalte ich mit obigem Code eine Exception da nun der Wert von SelectedValue keine DataRowView sondern den direkten Wert enthält.

Nur wieso... ?? Oder was sehe ich hier nicht?

5.299 Beiträge seit 2008
vor 13 Jahren

Es gibt .SelectedItem und .SelectedValue.
.SelectedItem ist das DataRowView, und .SelectedValue funzt nur, wenn die .ValueMember-Property sinnig gesetzt ist. Dann ist .SelectedValue die per .ValueMember spezifizierte Property des DataRowView.
Aber casten musste halt so oder so. Hastemal meinen Ansatz verfolgt?

Der frühe Apfel fängt den Wurm.

M
med Themenstarter:in
103 Beiträge seit 2008
vor 13 Jahren

Hallo

Erst einmal vielen Dank für die Geduld! Ich habe schon langsam an mir selbst gezweifelt...

Den Weg mit der Klassenvariable habe ich einmal verfolgt, nachdem ich es beim ersten Anlauf nicht wie gewünscht hinbekommen habe, habe ich es aber wieder zurückgestellt, da mir der Ansatz irgendwie nicht gefiel. Diese Information muss doch im Senderobjekt existieren.

Folgende Ausage hat mich auf die richtige Fährte gebracht:
"wenn die .ValueMember-Property sinnig gesetzt ist"

Somit war das ganze Problem behoben indem ich die DataSource dem Combobox Objekt erst nach dem Setzen der ValueMember und DisplayMember zugewiesen habe.

Das Problem:


DataTable dtUsr = new DataTable();
dtUsr = this.dbq.GetT_User();
cBoxUserSwitch.DataSource = dtUsr;
cBoxUserSwitch.ValueMember = "ID";
cBoxUserSwitch.DisplayMember = "LoginName";

Die Lösung:


DataTable dtUsr = new DataTable();
dtUsr = this.dbq.GetT_User();
cBoxUserSwitch.ValueMember = "ID";
cBoxUserSwitch.DisplayMember = "LoginName";
cBoxUserSwitch.DataSource = dtUsr;

Mit der Zeile "cBoxUserSwitch.DataSource = dtUsr;" wurde der Event ausgelöst, der ValueMember jedoch war noch nicht "sinnig" gesetzt.

Vielen dank an alle!
med