2011-06-28 17 views
10

To musi być bardzo łatwe, ale utknąłem. Mam listbox z elementami X. Każda pozycja ma opis tekstowy (który pojawia się w liście list) i jego wartość (numeryczną). Chcę móc uzyskać wartość właściwości elementu, używając indeksu numeru pozycji.Uzyskaj wartość pozycji listbox według indeksu

+1

WPF WinForms, ASP.NET lub Silverlight? –

+0

Dodaj tagi szczegółowo opisujące, czego używasz, jak powiedział Daniel Hilgarth powyżej. –

+0

Czy pracujesz nad aplikacją _windows formula_? –

Odpowiedz

0

Działa to dla mnie:

ListBox x = new ListBox(); 
x.Items.Add(new ListItem("Hello", "1")); 
x.Items.Add(new ListItem("Bye", "2")); 

Console.Write(x.Items[0].Value); 
+5

O ile mi wiadomo, 'ListBox.Items' jest typu' System.Windows.Forms.ListBox.ObjectCollection' co oznacza, że ​​'ListBox.Items [index]' jest obiektem, który nie ma właściwości Value !! –

+1

To była odpowiedź dla WebForms, ponieważ odnosi się on do Ustawień a Tekst i Wartość, co spowodowało, że założyłem WebForms, a nie WinForms. – DaveShaw

1

Załóżmy, że chcemy wartość pierwszego elementu.

ListBox list = new ListBox(); 
Console.Write(list.Items[0].Value); 
3

Jeśli pracujesz na Windows Forms projektu można spróbować wykonać następujące czynności:

dodać elementy do ListBox jak KeyValuePair obiektów:

listBox.Items.Add(new KeyValuePair(key, value); 

Potem będzie można je odzyskać w następujący sposób:

KeyValuePair keyValuePair = listBox.Items[index]; 
var value = keyValuePair.Value; 
+0

Próbowałem, ale to nie działało :( – tzam

+0

@tzam: Pracujesz nad aplikacją formularzy _windows? –

+0

To prawda Akram – tzam

3

Używam Bind ingSource z SqlDataReader za nim i żaden z powyższych nie działa dla mnie.

Pytanie dla Microsoft: Dlaczego to działa:

? lst.SelectedValue 

Ale to nie robi?

? lst.Items[80].Value 

znajdę muszę wrócić do do obiektu BindingSource, rzucić go jako System.Data.Common.DbDataRecord, a następnie zapoznać się z jego nazwy kolumny:

? ((System.Data.Common.DbDataRecord)_bsBlocks[80])["BlockKey"] 

Teraz to tylko śmieszny.

+0

Alternatywnie, myślę, że mógłbym iterować poprzez kolekcję Items, wybierając każdy element, a następnie otrzymując SelectedValue, ale nie powinienem był tego robić, i tak czy inaczej jest to kludge –

+0

. Zbiór pozycji 'ListBox' jest obiektem typu i nie ma właściwości' Value' .Przedmiotem może być 'DataRowView', a obiekt złożony lub podstawowy. Wartość należy obliczyć za pomocą właściwości 'ValueMember', w taki sam sposób działa funkcja' SelectedValue'. –

8

Byłoby

String MyStr = ListBox.items[5].ToString(); 
+0

Elementy mogą być 'DataRowView' lub złożonym obiektem lub innymi typami. Wartość bazowa pozycji powinna być obliczona na podstawie "ValueMember". –

5

Tu nie widzę nawet jednej poprawnej odpowiedzi na to pytanie (w tagu WinForms) i jest to dziwne dla tak częste pytanie.

Elementami kontrolki mogą być DataRowView, złożone obiekty, typy anonimowe, typy podstawowe i inne typy. Wartość bazowa pozycji powinna być obliczona na podstawie ValueMember.

ListBox Sterowanie ma GetItemText, co pomaga uzyskać tekst pozycji niezależnie od typu obiektu dodanego jako pozycja. Naprawdę potrzebuje takiej metody GetItemValue.

GetItemValue Extension Metoda

Możemy stworzyć GetItemValueextension method uzyskać wartość elementu, który działa jak GetItemText:

using System; 
using System.Windows.Forms; 
using System.ComponentModel; 
public static class ListControlExtensions 
{ 
    public static object GetItemValue(this ListControl list, object item) 
    { 
     if (item == null) 
      throw new ArgumentNullException("item"); 

     if (string.IsNullOrEmpty(list.ValueMember)) 
      return item; 

     var property = TypeDescriptor.GetProperties(item)[list.ValueMember]; 
     if (property == null) 
      throw new ArgumentException(
       string.Format("item doesn't contain '{0}' property or column.", 
       list.ValueMember)); 
     return property.GetValue(item); 
    } 
} 

Stosując powyższe metody nie trzeba się martwić o ustawienia ListBox i to zwróci oczekiwany Value dla przedmiotu.Działa z List<T>, Array, , DataTable, listą typów anonimowych, listą typów podstawowych i wszystkimi innymi listami, których można użyć jako źródła danych. Oto przykład użycia:.

//Gets underlying value at index 2 based on settings 
this.listBox1.GetItemValue(this.listBox1.Items[2]); 

Ponieważ stworzyliśmy metodę GetItemValue jako metodę rozszerzenia, gdy chcesz użyć metody, nie zapomnij podać przestrzeń nazw, które można umieścić klasę w

Ta metoda ma również zastosowanie w przypadku ComboBox i CheckedListBox.

0

prostu spróbować ListBox jest lista i yu jest veriable do wich wartość na indeksie 0 będzie przypisany

string yu = listBox1.Items[0].ToString(); 
MessageBox.Show(yu);