2009-02-03 38 views
6

Estoy escribiendo una aplicación de winforms en la que un usuario selecciona un elemento de un cuadro de lista y edita algunos datos que forman parte de un objeto asociado. Las modificaciones se aplican desde la lista de objetos a un archivo subyacente.¿Cómo obtengo la "clave" del elemento de la lista en la aplicación C# winforms?

En ASP.Net asignar un valor de sistema diferente a un elemento de la lista que el texto de visualización que el usuario ve es trivial. En una aplicación de winforms, debe establecer el "Displaymember" y el "Valuemember" de cada elemento en un proceso un poco más complicado (y no muy relacionado en Internet).

Esto lo he hecho. En el modo de depuración, he confirmado que cada elemento ahora tiene un valor que es el miembro de visualización (una cadena "amigable" que el usuario ve) y una clave, el miembro de valor, que contiene la clave de un objeto hashtable donde los datos se actualizarán existe

Así que cuando un usuario elige una cadena para editar el programa debe pasar la "clave" a la tabla hash, tirar del objeto y permitir que la edición tenga lugar en él.

¿La captura?

No veo ninguna forma obvia de decirle al programa que mire al miembro de valor del artículo. Ingenuamente esperaba que llenara la propiedad "SelectedValue" del cuadro de lista, pero eso sería demasiado simple por el momento. Entonces, ¿cómo demonios llego al valor del elemento de la lista?

Respuesta

4

Está bien, así que la respuesta vino como resultado de la respuesta de Andy, de ahí mi voto arriba esa respuesta.

Pero cuando creé una pequeña clase y traté de convertir el listitem en esa clase, el programa arrojó una excepción.

Reveladoramente, la excepción me dijo que el programa no podía convertir un DictionaryEntry en una clase del tipo que había definido.

Así que suprime la clase de proxy y replanteó esta solicitud así:

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

y todo es bueno.

Respuesta extrañamente simple al final. Gracias por la pista Andy.

1

Intente obtener el "ValueMember" dentro del evento ListBox1_SelectedValueChanged.

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

Utilizando tanto el SelectedIndexChanged y SelectedValueChanged no funcionó para mí - la propiedad ListBox'sSelectedValue siempre fue nula. Esto también me sorprendió.

Como solución cojo, sólo podría tirar del objeto fuera de la ListBox directamente, usando el SelectedIndex:

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 es sólo una clase simple con dos propiedades - ID y Name).

Parece que debería haber una manera mejor, pero en todo caso esto debería funcionar.

+0

¿Ha establecido la propiedad DataSource? – Phaedrus

+0

No lo hice, pero solo estaba tratando de armar una muestra rápida. Supuse (¿incorrectamente?) Que SelectedValue se establecería independientemente de dónde provenían los datos. – Andy

0

hehehe Terminé aquí cuando estaba buscando cómo obtener el valor de un artículo en ListBox, entonces se me ocurrió lo obvio. El secreto es que el método de artículos en C#, VB y otros es una matriz, así que para obtener un valor de cualquier artículo sólo hay que escribir esto:

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

Para obtener todos los elementos y puesto en un documento o a una cadena, solo haz una para como esta:

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

Espero les ayudé chicos. Esta es la respuesta más simple para tu publicación.

2

Sé que esta es una publicación muy antigua, pero no pude convertir mis elementos del cuadro de lista en un elemento del Diccionario. Esta solución funcionó para mí en .NET 3.5 para formularios de Windows.

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

Una manera sencilla y limpia:

Agregar elemento (incluir clave y el valor) a ListBox:

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


consigue el artículo en la selección del usuario:

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 

el lsbListBoxName es el nombre de ListBox y el código es VB.NET puede usar This Online Tool al convento al C#.

Cuestiones relacionadas