2009-05-18 16 views
8

Ich habe eine Mehrfachauswahlliste, die ich an eine DataTable binde. DataTable enthält 2 Spalten Beschreibung und Wert.Ausgewähltes Element in einer ListBox ohne Schleife einstellen

Hier ist der listbox bevöl Code:

DataTable copytable = null; 
       copytable = GlobalTable.Copy(); // GlobalTable is a DataTable 
       copytable.Rows[0][0] = "--ALL--"; 
       copytable.Rows[0][1] = "--ALL--"; 

       breakTypeList.DataSource = copytable; 
       this.breakTypeList.DisplayMember = copytable.Columns[0].ColumnName; // description 
       this.breakTypeList.ValueMember = copytable.Columns[1].ColumnName; // value 
       this.breakTypeList.SelectedIndex = -1; 

Ich gründe Beschreibung als Display und Wert wie die Valuemember der List-Box. Jetzt abhängig davon, was der Wert übergeben wird, muss ich das ausgewählte Element in der ListBox festlegen.

Hier ist mein Code:

ListBox lb = c as ListBox; 
lb.SelectedValue = valuePassedByUser; 

, die nicht funktioniert. Daher muss ich unten auf den Code zurückgreifen (wo ich Schleife durch alle Elemente in dem Listenfeld)

for (int i = 0; i < lb.Items.Count; i++) 
      { 
       DataRowView dr = lb.Items[i] as DataRowView; 
       if (dr["value"].ToString() == valuePassedByUser) 
       { 
        lb.SelectedIndices.Add(i); 
        break; 
       } 
      } 

Ich mag würde wissen, was in meinem Code fehlt/fehlerhaft. Warum ist lb.SelectedValue = valuePassedByUser; falsche Artikel auswählen?

+0

Können Sie weitere Informationen darüber geben, was genau Sie tun müssen oder ein vollständigeres Beispiel für den Code? Soll das Objekt ein Feld aus einer Datenbank lesen und den ausgewählten Index/Wert auf einen übereinstimmenden Wert in der Listbox setzen? – ryanulit

+0

Das Listenfeld wird mit einer DataTable gefüllt, die wiederum Daten aus der Datenbank enthält. Meine Sorge ist, wenn ich das ValueMember während des Auffüllens der Liste gesetzt habe, warum ist lb.SelectedValue = valuePassedByUser; funktioniert nicht? –

Antwort

7

Ok ... hier kommt die schwer zu verdauliche Antwort, die ich erst gestern realisiert habe. Es ist jedoch mein Fehler, dass ich in meiner Frage keine wichtige Sache erwähnt habe, weil ich dachte, dass sie für das vorliegende Problem irrelevant ist:

Die Daten in der Datentabelle wurden nicht sortiert. Daher habe ich die sortierte Eigenschaft der Listbox auf True festgelegt. Später wurde mir klar, wenn die sortierte Eigenschaft der Listbox oder sogar der Kombinationsbox auf true gesetzt ist, dann wird der value member nicht richtig gesetzt. Also, wenn ich schreibe: so ausgewählt, anstatt settting derjenige, dessen Wert ist valuePassedByUser

lb.SelectedValue = valuePassedByUser;

es ein anderes Element stellt. Kurz gesagt, es verwirrt die Indizes.

Für z.B. wenn meine Anfangsdaten sind:

Index ValueMember DisplayMember 
1   A   Apple 
2   M   Mango 
3   O   Orange 
4   B   Banana 

Und ich sortierte = wahr. Dann werden die Listbox Elemente sind:

Index ValueMember DisplayMember 
1   A   Apple 
2   B   Banana 
3   M   Mango 
4   O   Orange 

Nun, wenn ich Banana festlegen möchten, wie ausgewählt, betreibe ich die Anw:

lb.SelectedValue = "B";

Doch statt Banana der Einstellung als ausgewählt, setzt sie, Orange als ausgewählt. Warum? Weil die Liste nicht sortiert worden wäre, wäre der Index von Banana 4. Also, obwohl nach dem Sortieren des Index von Banana 2 ist, setzt er den Index 4 als ausgewählt, wodurch Orange statt Banana ausgewählt wird.

daher für sortierte listbox, ich den folgenden Code verwende ausgewählten Elemente zu setzen:

private void SetSelectedBreakType(ListBox lb, string value) 
{ 
    for (int i = 0; i < lb.Items.Count; i++) 
    { 
     DataRowView dr = lb.Items[i] as DataRowView; 
     if (dr["value"].ToString() == value) 
     { 
      lb.SelectedIndices.Add(i); 
      break; 
     } 
    } 
} 
0

Versuchen Sie folgendes: -

var listBox = c as ListBox; 
    var item = listBox.Items.FindByValue(fieldValue); 
    if (item != null) 
    listBox.SelectedValue = fieldValue; 
+2

Es gibt keinen FindByValue in der Items-Auflistung. – norlando

1

Ich denke, der einzige Weg, Sie werden mehrere Elemente auswählen können, ist durch eine foreach-Schleife. Die SelectedValue-Eigenschaft scheint nur 1 Element zurückzugeben. Wenn Sie mehr als 1 Artikel auswählen möchten, müssen Sie verwenden müssen:

var tempListBox = c As ListBox; 
if (tempListBox != null) 
    (tempListBox.SelectedItems.Add(tempListBox.Items[tempListBox.FindStringExact(fieldValue)]); 

Auch die Findstringexact nicht durch die Wertfelder durchsucht, es nur durch den angezeigten Text aussieht. Um Code zu reduzieren, möchten Sie vielleicht eine neue Variable als Listbox darstellen, damit Sie C nicht weiterhin als Listbox darstellen.

0

Sie können "FindByValue" wie folgt verwenden:

ListBox.SelectedIndex = ListBox.Items.IndexOf(ListBox.Items.FindByValue(fieldValue)) 
0
this.Character.SetSelected(this.Character.Items.IndexOf(this.textBox1.Text),true); 
0

Hier ist, wie ich gelöst es, mit Winforms, DotNet 4.6

listBox1.SelectedIndex = listBox1.FindString(stringInList); 
0

Wenn Sie keine Schleife für ausgewählte Elemente erstellen möchten, rufen Sie den ausgewählten Wert des Listenfelds im listBox_SelectedIndexChanged-Ereignis ab und fügen Sie diesen Wert im globalen Array hinzu. Wenn Sie dann auf dieses Array zugreifen, erhalten Sie den gewünschten Wert für den Wert itemlist ohne eine Schleife.

Verwandte Themen