Entwickler-Ecke

Basistechnologien - SelectedItem()-Eigenschaft für die ComboBox


dinazavric - Fr 13.05.11 11:07
Titel: SelectedItem()-Eigenschaft für die ComboBox
Ich bräuchte wieder euer Hilfe. Ich habe ein Problem wo ich nicht weiter komme, vielleicht verstehe ich da was falsch... Bei einer ComboBox möchte ich nachschauen ob ein Wert ausgewählt wurde oder nicht. Die ComboBox ist über ein Binding an die Daten gebunden und für den Anfang mit ComboBox1.SelectedItem = null auf "leer" gesetzt. Wenn ich aber sowas schreibe:


C#-Quelltext
1:
if (ComboBox1.SelectedItem == null) {...}                    


geht es immer rein, wenn auch nichts ausgewählt wurde... wieso passiert das? Liegt es am Binding? Das gleiche habe ich auch mit SelectedValue usw. probiert, funktioniert aber trotzdem nicht...
Vielen Dank für die Hilfe


dinazavric - Do 19.05.11 11:26

kann mir keiner helfen?? :-(


Th69 - Do 19.05.11 12:23

Hallo,

irgendwie verstehe ich deine Frage nicht, denn du schreibst ja
dinazavric hat folgendes geschrieben:

geht es immer rein, wenn auch nichts ausgewählt wurde...

Und "nichts" heißt eben "comboBox.SelectedItem" ist "null".


dinazavric - Do 19.05.11 12:49

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
irgendwie verstehe ich deine Frage nicht


Ich habe ein DataSet, in dem ich vorher einige Daten speichere. Dabei werden diese Daten an eine ComboBox gebunden. Ein Benutzer kann die eingestellten Werte eintragen, falls die Box leer ist, sprich keine Daten vorher gespeichert wurden, oder ändern. Um die ComboBox auf "leer" zu stellen benutze ich SelectedItem = null. Dabei wird kein Item angezeigt. Eine Liste an möglichen Items ist aber nach wie vor da. Um die Daten neu zu ünernehmen und abzuspeichern muss ich überprüfen ob ein Item ausgewählt wurde oder ob die ComboBox immer noch leer ist. Das mache ich auch mit if (SelectedItem == null). Falls die ComboBox "leer" steht, ist bei mir die Bedingung trotzdem "true".


jaenicke - Do 19.05.11 13:36

user profile icondinazavric hat folgendes geschrieben Zum zitierten Posting springen:
Falls die ComboBox "leer" steht, ist bei mir die Bedingung trotzdem "true".
Naja, du testest ja auch auf leer. Du meinst wohl eher das Gegenteil...


bakachan - Do 19.05.11 13:49

Ich glaube er will darauf hinnaus das keins der Items ausgewählt aber ein Text eingegeben wurde.
Den Inhalt findest du dann auch in der Text-Property.
Und bedenke das nur weil der Text eines Items eingegeben wurde nicht gleichzeitig auch dieses Item ausgewählt wird (zumindest nicht ohne einen AutoCompleteMode).


dinazavric - Do 19.05.11 13:54

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Naja, du testest ja auch auf leer. Du meinst wohl eher das Gegenteil...


ja stimmt, ich teste schon auf != null :-) das Problem bleibt aber trotzdem


user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube er will darauf hinnaus das keins der Items ausgewählt aber ein Text eingegeben wurde.
Den Inhalt findest du dann auch in der Text-Property. Und bedenke das nur weil der Text eines Items eingegeben wurde nicht gleichzeitig auch dieses Item ausgewählt wird (zumindest nicht ohne einen AutoCompleteMode).


Das ist es eben auch, dass ich nur im Fall, wo kein Item ausgewählt wurde, weiter machen möchte. Was am Text drin steht ist mir relativ egal... Ich sage es mal anders, egal was ich mache, ist mein SelecteItem nie null... was soll ich machen um die "leere" ComboBox zu identifizieren?


bakachan - Do 19.05.11 14:07

Wenn in der ComboBox nichts ausgewählt ist ist das SelectedItem null und der SelectedIndex -1.
Wenn das bei dir nie der Fall ist, ist halt immer etwas ausgewählt.
Ich glaube nicht das der Fehler bei deiner Bedingung liegt.


dinazavric - Do 19.05.11 14:19

user profile iconbakachan hat folgendes geschrieben Zum zitierten Posting springen:
Ich glaube nicht das der Fehler bei deiner Bedingung liegt.


wie gesagt, da die Daten an die Box gebunden sind, kann es sein, dass wenn auch nichts angezeigt wird, trotzdem durch die Bindung ein SelectedItem immer da ist? Es ist nähmlich so, dass dabei immer der erste Wert aus dem DataSet übernommen wird, wenn ich bei einer "leeren" Box auf SelectedItem.Text.ToString() den Inhalt speichern möchte. Deswegen wollte ich auch um dies zu vermeiden erst schauen ob die wirklich leer ist...


Ralf Jansen - Do 19.05.11 14:22

Vielleicht mal ein wenig mehr Code zeigen. Sonst reden wir hier die ganze Zeit nur darüber was du denn genau meinen könntest.

Zeuge am besten die Codestelle(n) die folgende Fragen beantworten könnten.

Wie hast du gebunden (die Auswahlliste und/oder auch die die Selektion z.B. über SelectedItem oder Text)?
Was hast du gebunden (von was für einem Datentyp reden wir hier, wenn du SelectedItem gebunden hast ist der gebundene Typ vielleicht gar nicht nullable)?
Wie ist die Combobox sonst noch eingestellt.
Wann fragst du den Zustand von SelectedItem ab (Hat dann die Combobox noch den Focus, oder fragst du gerade ab wenn du gerade gebunden hast)


dinazavric - Do 19.05.11 14:35

Genau, das ist mein Code, zumindest die Stellen, die relevant sind. Da ich mehrere ComboBoxen habe und diese als Array zusammengefasst, werde ich es immer für eine i-te Box zeigen.

Die Bundung:

C#-Quelltext
1:
2:
3:
4:
5:
6:
BindingSource bs = new BindingSource();
bs.DataSource = dataSetPro;
NameControls[i].DisplayMember = "Parameters.ParameterName";
NameControls[i].ValueMember = "Parameters.ParameterName";
NameControls[i].DataSource = bs;
NameControls[i].SelectedItem = null;


Es wurde ein String-Wert gebunden... Dann übernehme ich die Daten, falls diese vorher gespeichert wurden:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
                    int j = 0;
                    foreach (DataRow dataRow in dataSetPro1.Tables["ParameterSelect"].Rows)
                    {
                        if (dataRow["ProtocolID"].ToString() == IdTpro.Text)
                        {
                            if (j < 10)
                            {
                                NameControls[j].Text = dataRow["ParameterName"].ToString();
                                j++;
                            }
                            else break;
                        }
                        else
                        {
                            if (j < 10)
                            {
                                NameControls[j].SelectedItem = null;
                            }
                            else break;
                        }
                    }


Dann kommt eben die Abfrage nach einem null-Item.

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
                    if (NameControls[i].SelectedItem == null)
                    {
                        Status.Text = "...";
                    }
                    else
                    {
                        DataRow newRow = dataSetPro.Tables["ParameterSelect"].NewRow();
                        newRow["ParameterName"] = NameControls[i].Text.ToString();
                        dataSetPro.Tables["ParameterSelect"].Rows.Add(newRow);
                    }


dinazavric - Fr 20.05.11 11:38

Was ich hier vergessen habe einzugeben, ist dass ich before ich das SelectedItem geprüft habe, habe ich dataSetPro.AcceptChanges() gemacht. Das war wohl mein Fehler! Das DataSet wird dadurch aktualisiert und natürlich alles was damit verbunden ist auch. Obwohl die ComboBoxen immer noch "leer" erschienen, waren die SelectedItems schon verbunden...

Nun habe ich AcceptChanges() auskommentiert und sehe da - es funktioniert!!!! :-D

Ich bedanke mich hier bei allen, die mir helfen wollten!