2009-02-03 6 views
6

Ich schreibe eine Winforms-App, in der ein Benutzer ein Element aus einer Listbox auswählt und einige Daten bearbeitet, die Teil eines zugeordneten Objekts sind. Die Änderungen werden dann von der Objektliste auf eine zugrunde liegende Datei angewendet.Wie bekomme ich den "Schlüssel" des Listbox-Elements in der C# winforms App?

In ASP.Net zuweisen einen anderen Systemwert zu einem Listenelement als der angezeigte Text ist der Benutzer trivial. In einer winforms App müssen Sie das "Displaymember" und das "ValueMember" jedes Elements in einem etwas komplizierteren (und nicht oft im Internet verwandten) Prozess einstellen.

Das habe ich getan. Im Debug-Modus habe ich bestätigt, dass jedes Element jetzt einen Wert hat, der das Anzeigeelement ist (eine "freundliche" Zeichenfolge, die der Benutzer sieht) und einen Schlüssel, das valueMember, das den Schlüssel zu einem Hashtable-Objekt enthält, in dem die Daten aktualisiert werden existiert.

Wenn also ein Benutzer eine Zeichenfolge zur Bearbeitung auswählt, sollte das Programm den "Schlüssel" an die Hashtabelle übergeben, das Objekt herausziehen und die Bearbeitung darauf erlauben.

Der Haken?

Ich kann keine offensichtliche Weise sehen, dass das Programm den ValueMember des Elements betrachten soll. Ich habe naiv erwartet, dass es die "SelectedValue" -Eigenschaft der Listbox auffüllt, aber das wäre bei weitem zu einfach. Wie zum Teufel komme ich zum Listenwert?

Antwort

4

Okay, die Antwort kam als Ergebnis von Andys Antwort, daher meine Antwort.

Aber als ich eine kleine Klasse erstellt und versucht habe, das Listenelement in diese Klasse zu konvertieren, hat das Programm eine Ausnahme ausgelöst.

Offenbar erzählte mir die Ausnahme, dass das Programm einen DictionaryEntry nicht in eine Klasse des von mir definierten Typs umwandeln konnte.

So löschte ich die Proxy-Klasse und die Anfrage so umformuliert:

DictionaryEntry de = (DictionaryEntry)listbox.SelectedItem;
string htKey = de.Key.ToString();

Und es ist alles gut.

Bizarr einfache Antwort am Ende. Danke für den Hinweis Andy.

1

Versuchen Sie, die "ValueMember" aus dem ListBox1_SelectedValueChanged-Ereignis zu greifen.

private void ListBox1_SelectedValueChanged(object sender, EventArgs e) 
{ 
    if (ListBox1.SelectedIndex != -1) 
    { 
     string orbit = ListBox1.SelectedValue.ToString(); 
    } 
} 

ArrayList planets = new ArrayList(); 
planets.Add(new Planet("Mercury", "1")); 
planets.Add(new Planet("Venus", "2")); 

//Remember to set the Datasource 
ListBox1.DataSource = planets; 
//Name and Orbit are properties of the 'Planet' class 
ListBox1.DisplayMember = "Name"; 
ListBox1.ValueMember = "Orbit"; 
5

Verwendung sowohl die SelectedIndexChanged und SelectedValueChanged nicht für mich arbeiten - die ListBox'sSelectedValue Eigenschaft war immer null. Das hat mich auch überrascht.

Als lahm Problem zu umgehen, könnten Sie ziehen einfach das Objekt aus dem ListBox direkt, die SelectedIndex mit:

public Form1() 
{ 
    InitializeComponent(); 

    this.listBox1.DisplayMember = "Name"; 
    this.listBox1.ValueMember = "ID"; 

    this.listBox1.Items.Add(new Test(1, "A")); 
    this.listBox1.Items.Add(new Test(2, "B")); 
    this.listBox1.Items.Add(new Test(3, "C")); 
    this.listBox1.Items.Add(new Test(4, "D")); 
    this.listBox1.Items.Add(new Test(5, "E")); 
} 

private void OnSelectedIndexChanged(object sender, EventArgs e) 
{ 
    if(-1 != this.listBox1.SelectedIndex) 
    { 
     Test t = this.listBox1.Items[this.listBox1.SelectedIndex] as Test; 
     if(null != t) 
     { 
      this.textBox1.Text = t.Name; 
     } 
    } 
} 

(Test ist nur eine einfache Klasse mit zwei Eigenschaften - ID und Name).

Es scheint, als sollte es einen besseren Weg geben, aber wenn nichts anderes sollte das funktionieren.

+0

Haben Sie die DataSource-Eigenschaft festgelegt? – Phaedrus

+0

tat ich nicht, aber ich wollte nur eine schnelle Probe zusammenstellen. Ich nahm (falsch?) An, dass der SelectedValue gesetzt würde, unabhängig davon, woher die Daten kamen. – Andy

0

hehehe Ich bin hier gelandet, als ich nach dem Wert eines Items in ListBox gesucht habe, dann kam mir das Offensichtliche in den Sinn. Das Geheimnis, das Item-Methode in C# ist, VB und andere ist ein Array, so einen Wert eines beliebigen Punkt bekommen Sie müssen nur schreiben:

ListBox1.Items[1].toString();//Get value of the #1 Item in the ListBox; 

alle Einzelteile zu erhalten und in ein Dokument setzen oder zu einer Zeichenkette, mach einfach ein wie folgt:

String Value; 
for(int c=0;c<ListBox1.Items.Count;c++){ 
Value = Value + ListBox1.Items[c].toString(); 
} 
//Thats it 

Ich hoffe, ich habe euch geholfen. Dies ist die einfachste Antwort auf Ihren Post.

2

Ich weiß, dass dies eine sehr alte Post, aber ich war nicht in der Lage zu meinen Liste Feldelemente in einen Wörterbuch Artikel zu werfen. Diese Lösung hat in .NET 3.5 für Windows-Formulare funktioniert.

KeyValuePair<int, string> kvp = (KeyValuePair<int, string>)listBoxSystems.SelectedItem; 
string szValue = kvp.Value; 
0

Eine einfache und saubere Art und Weise:

Element hinzufügen (enthalten Key und Value) zu ListBox:

lsbListBoxName.Items.Insert(0, New ListItem("Item 1", 1)) 
lsbListBoxName.Items.Insert(0, New ListItem("Item 2", 2)) 
... 


Erhalten Sie Artikel auf Benutzerauswahl:

Private Sub lsbListBoxName_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lsbListBoxName.SelectedIndexChanged 
    Console.WriteLine(TryCast(lsbListBoxName.SelectedItem, ListItem).Text) 
    Console.WriteLine(TryCast(lsbListBoxName.SelectedItem, ListItem).Value) 
End Sub 

die lsbListBoxName ist der Name von ListBox und der Code ist VB.NET Sie können This Online Tool verwenden, um zu C# convertieren.

Verwandte Themen