Как получить "ключ" элемента списка в приложении 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#.