2011-06-28 3 views
10

Это должно быть очень просто, но я застрял. У меня есть listBox с X элементами. Каждый элемент имеет текстовое описание (которое появляется в спискеBox) и его значение (числовое). Я хочу иметь возможность получить значение свойства элемента, используя номер индекса элемента.Получите значение для элемента списка по индексу

+1

WPF, WinForms, Silverlight или ASP.NET? –

+0

Добавьте несколько тегов, в которых подробно описано, что вы используете, например, Daniel Hilgarth. –

+0

Вы работаете над приложением _windows forms_? –

ответ

0

Это работает для меня:

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

Насколько я знаю, 'ListBox.Items' имеет тип' System.Windows.Forms.ListBox.ObjectCollection', что означает 'ListBox.Items [index]' - это объект, у которого нет свойства Value! –

+1

Это был ответ для WebForms, поскольку он имеет в виду настройки текста и значения, что заставило меня принять WebForms, а не WinForms. – DaveShaw

1

Предположим, вы хотите получить значение первого элемента.

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

Если вы работаете на окна формы проекта вы можете попробовать следующее:

Добавление элементов к ListBox как KeyValuePair объектов:

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

Тогда вы сможете получить их следующим образом:

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

Я пробовал, но это не сработало :( – tzam

+0

@tzam: Вы работаете над _windows forms_ application? –

+0

это правильно Akram – tzam

3

Я использую привязку ingSource с SqlDataReader за ним, и ни одно из вышеперечисленных работ для меня не работает.

Вопрос для Microsoft: Почему эта работа:

? lst.SelectedValue 

Но это не делает?

? lst.Items[80].Value 

Я считаю, что я должен вернуться к объекту BindingSource, брось как System.Data.Common.DbDataRecord, а затем обратитесь к его имени столбца:

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

Теперь это просто смешной.

+0

В качестве альтернативы я предполагаю, что я мог выполнять итерацию по коллекции Items, выбирая каждый элемент, а затем получая SelectedValue. Но мне не нужно было это делать, и это все равно kludge. –

+0

Элемент ' Элемент коллекции 'ListBox' имеет объект типа и не имеет свойства' Value'. Элемент может быть «DataRowView», сложный объект или первичный тип. Значение должно рассчитываться с использованием свойства ValueMember, так же, как и 'SelectedValue'. –

8

Было бы

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

Элементы могут быть «DataRowView» или сложным объектом или другими типами. Базовое значение элемента должно рассчитываться на основе «ValueMember». –

5

Здесь я не могу видеть даже один правильный ответ на этот вопрос (в WinForms теге), и это странно для такого частого вопроса.

Элементы управления ListBox могут быть DataRowView, сложные объекты, анонимные типы, первичные типы и другие типы. Базовое значение предмета должно быть рассчитано на основе ValueMember.

ListBox control имеет GetItemText, который поможет вам получить текст элемента независимо от типа объекта, который вы добавили в качестве элемента. Он действительно нуждается в таком методе GetItemValue.

GetItemValue метод расширения

Мы можем создать GetItemValueextension method, чтобы получить значение элемента, который работает как 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); 
    } 
} 

Используя выше метода вам не нужно беспокоиться о настройках ListBox и нем вернет ожидаемый Value за товар.Он работает с List<T>, Array, ArrayList, DataTable, Список анонимных типов, список основных типов и всех других списков, которые вы можете использовать в качестве источника данных. Вот пример использования:.

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

Так как мы создали метод GetItemValue как метод расширения, когда вы хотите использовать метод, не забывайте включать пространство имен, которое вы положили класс в

Этот метод применим также к ComboBox и 10.

0

просто попробовать это ListBox ваш список и юй является veriable к которым значение по индексу 0 будет присвоен

string yu = listBox1.Items[0].ToString(); 
MessageBox.Show(yu); 
Смежные вопросы