Как мне получить "ключ" элемента списка в приложении c # winforms? - PullRequest
6 голосов
/ 03 февраля 2009

Я пишу приложение winforms, в котором пользователь выбирает элемент из списка и редактирует некоторые данные, которые составляют часть связанного объекта. Затем изменения применяются из списка объектов к базовому файлу.

В ASP.Net назначение системному значению элемента списка, отличного от отображаемого пользователем текста, тривиально. В приложении winforms вы должны установить «Displaymember» и «Valuemember» каждого элемента в несколько более сложном (и не часто связанном с Интернетом) процессе.

Это я и сделал. В режиме отладки я подтвердил, что у каждого элемента теперь есть значение, которое является отображаемым элементом («дружественная» строка, которую видит пользователь), и ключом, значащим элементом, который содержит ключ к объекту хеш-таблицы, где обновляются данные существует.

Поэтому, когда пользователь выбирает строку для редактирования, программа должна передать «ключ» в хеш-таблицу, выдернуть объект и разрешить ему редактирование.

Подвох?

Я не вижу очевидного способа заставить программу взглянуть на значение элемента. Я наивно ожидал, что это заполнит свойство списка SelectedValue, но это было бы слишком просто. Так, как, черт возьми, я могу получить значение элемента списка?

Ответы [ 6 ]

5 голосов
/ 03 февраля 2009

Хорошо, поэтому ответ пришел в результате ответа Энди, поэтому я и проголосовал за этот ответ.

Но когда я создал небольшой класс и попытался преобразовать элемент списка в этот класс, программа вызвала исключение.

Показательно, что исключение говорит мне, что программа не может преобразовать DictionaryEntry в класс определенного мной типа.

Итак, я удалил прокси-класс и переформировал запрос следующим образом:

DictionaryEntry de = (DictionaryEntry)listbox.SelectedItem;<br />
string htKey = de.Key.ToString();

И все хорошо.

Странно простой ответ в конце. Спасибо за подсказку Энди.

5 голосов
/ 03 февраля 2009

Использование как SelectedIndexChanged, так и SelectedValueChanged не помогло мне - свойство ListBox's SelectedValue всегда было нулевым. Это меня тоже удивило.

В качестве неудачного обходного пути вы можете просто вытащить объект из 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).

Кажется, должен быть лучший путь, но если ничего другого не сработает.

2 голосов
/ 20 мая 2011

Я знаю, что это очень старая запись, но мне не удалось преобразовать элементы списка в элемент словаря Это решение работало для меня в .NET 3.5 для форм Windows.

KeyValuePair<int, string> kvp = (KeyValuePair<int, string>)listBoxSystems.SelectedItem;
string szValue = kvp.Value;
1 голос
/ 03 февраля 2009

Попробуйте получить «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";
0 голосов
/ 27 июля 2015

Простой и понятный способ:

Добавить элемент (включая ключ и значение) в список:

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 - это имя ListBox, а код - VB.NET , который вы можете использовать Этот онлайн-инструмент для преобразования в C # .

0 голосов
/ 14 апреля 2009

Я оказался здесь, когда искал, как получить значение Item в ListBox, и тогда мне пришло в голову очевидное.
Секрет в том, что метод Item в C#, VB и других является массивом, поэтому для получения значения любого Item вам просто нужно написать это:

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

Чтобы получить все элементы и поместить их в документ или строку, просто сделайте так:

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

Я надеюсь, что помог вам, ребята. Это самый простой ответ на ваш пост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...