Как получить "ключ" элемента списка в приложении c# winforms?
Я пишу приложение winforms, в котором пользователь выбирает элемент из списка и редактирует некоторые данные, которые являются частью связанного объекта. Затем изменения применяются из списка объектов к базовому файлу.
In ASP.Net назначение элементу списка другого системного значения, чем отображаемый текст, который видит пользователь, является тривиальным. В приложении winforms вы должны установить "Displaymember" и "Valuemember" каждого элемента в немного более сложном (и не часто связанном с процесс интернет).
Это я сделал. В режиме отладки я подтвердил, что каждый элемент теперь имеет значение, которое является отображаемым членом ("дружественной" строкой, которую видит пользователь) и ключом, valuemember, который содержит ключ к объекту hashtable, где существуют данные для обновления.
поэтому, когда пользователь выбирает строку для редактирования, программа должна передать "ключ" в хэш-таблицу, вытащить объект и разрешить редактирование на нем.
в поймать?
Я не вижу никакого очевидного способа сказать программе, чтобы посмотреть на valuemember элемента. Я наивно ожидал, что он заполнит свойство "SelectedValue" списка, но это было бы слишком просто. Так как же мне попасть в список стоимость товара?
6 ответов
используя SelectedIndexChanged
и SelectedValueChanged
не работает для меня -ListBox's
SelectedValue
свойство всегда было null. Меня это тоже удивило.
в качестве хромого обходного пути вы можете просто вытащить объект из ListBox
напрямую, используя 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
это просто простой класс с двумя свойствами - ID
и Name
).
кажется, что там должен быть лучший способ, но если ничего другого, это должно работать.
хорошо, поэтому ответ пришел в результате ответа Энди, поэтому я поддержал этот ответ.
но когда я создал небольшой класс и попытался привести listitem в этот класс, программа выдала исключение.
показательно, что исключение сказало мне, что программа не может привести DictionaryEntry в класс типа, который я определил.
поэтому я удалил прокси-класс и переформулировал запрос следующим образом:
DictionaryEntry de = (DictionaryEntry)listbox.SelectedItem;
string htKey = de.Key.ToString();
и все хороший.
странно простой ответ в конце. Спасибо за подсказку Энди.
Я знаю, что это очень старый пост, но я не смог поместить элементы списка в элемент словаря. Это решение работало для меня в .NET 3.5 для windows forms.
KeyValuePair<int, string> kvp = (KeyValuePair<int, string>)listBoxSystems.SelectedItem;
string szValue = kvp.Value;
попробуйте захватить "ValueMember" из события 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";
хехехе я оказался здесь, когда я искал, как получить значение элемента в ListBox, то очевидное пришло мне на ум. Секрет в том, что метод Item в c#, VB и других является массивом, поэтому для получения значения любого элемента вам просто нужно написать это:
ListBox1.Items[1].toString();//Get value of the #1 Item in the ListBox;
чтобы получить все элементы и поместить в документ или строку, просто сделайте для этого:
String Value;
for(int c=0;c<ListBox1.Items.Count;c++){
Value = Value + ListBox1.Items[c].toString();
}
//Thats it
надеюсь, я помог вам, ребята. Это самый простой ответ на ваш пост.
простой и понятный способ:
добавить элемент (включая ключ и значение) в ListBox:
lsbListBoxName.Items.Insert(0, New ListItem("Item 1", 1))
lsbListBoxName.Items.Insert(0, New ListItem("Item 2", 2))
...
Получить пункт на выбор пользователя:
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
на lsbListBoxName
- имя списка, а код VB.NET можно использовать Этот Онлайн-Инструмент монастырь к C#.