2009-11-13 2 views
19

У меня возникли проблемы с тем, как добавлять элементы в ListBox в WinForms.Как я могу добавить элемент в ListBox?

Пытаюсь:

list.DisplayMember = "clan"; 
list.ValueMember = sifOsoba; 

Как я могу добавить элементы в список с int значением (ValueMember) и некоторый текст (для DisplayMember)?

list.Items.add(?) 

Я не могу использовать ListBoxItem. Зачем?

+0

@jmein: Спасибо; Я пропустил тег csharp в своих усилиях по очистке оригинального сообщения. –

+3

Пожалуйста, не используйте код, указанный в принятом ответе. Это неверно. Класс (ListBoxItem), предложенный monksy, представляет собой класс WPF, который живет в пространстве имен WPF (System.Windows.Controls) в сборке WPF (PresentationFramework.dll). Разработчики Windows Forms НЕ ДОЛЖНЫ указывать сборки и классы из WPF в своих приложениях. Код может компилироваться и запускаться, но он НЕ ИСПРАВЛЯЕТ. – MichaelFStarke

ответ

10
list.Items.add(new ListBoxItem("name", "value")); 

Внутренняя (по умолчанию) структура данных ListBox - это ListBoxItem.

+6

listBoxItem? почему у меня этого нет? – Ante

+0

Ошибка была выполнена? Я добавил ссылку на класс doc – monksy

+4

Вы можете просто добавить объект - он не должен быть ListBoxItem. –

1

Вы должны создать элемент типа ListBoxItem и добавить, что в коллекцию Items:

list.Items.add(new ListBoxItem("clan", "sifOsoba")); 
+2

Метод ListBox.Items.Add() принимает объект http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.objectcollection.add(v=vs.100).aspx ListBoxItem, похоже, существует только как элемент управления wpf. Http://msdn.microsoft.com/en-us/library/system.windows.controls.listboxitem.aspx Поскольку вопрос касался winforms (http://msdn.microsoft. com/en-us/library/system.windows.forms.listbox (v = vs.100) .aspx) Я предполагаю, что ваш вышеописанный метод действителен только для wpf ListBox. – surfmuggle

9

В WinForms, ValueMember и DisplayMember используются при привязке данных списка. Если вы не привязываетесь к данным, вы можете добавить любой произвольный объект как ListItem.

Уловкой является то, что для отображения объекта на него будет вызываться ToString(). Таким образом, настоятельно рекомендуется добавлять объекты в ListBox, где вызов ToString() приведет к содержанию вывода.

+0

+1 для ToString() нужно назвать, помогло мне куча! (моя собственная ошибка не для переопределения toString в первую очередь, я стараюсь сделать это для каждого класса) – Spooks

5

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

например:

public class MyObject 
{ 
    public string clan { get; set; } 
    public int sifOsoba { get; set; } 
    public MyObject(string aClan, int aSif0soba) 
    { 
     this.clan = aClan; 
     this.sif0soba = aSif0soba; 
    } 

    public override string ToString() { return this.clan; } 
} 

.... 

list.Items.Add(new MyObject("hello", 5)); 

Если вы связываете его вручную, то вы можете использовать пример, предоставленный очки

7

Вы можете оформить этот SO вопрос:

C# - WinForms - What is the proper way to load up a ListBox?

+0

Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Trilarion

+1

@triIarion согласился бы, если бы это не было напрямую связано с StackOverflow. Также этот ответ был отправлен назад, когда в сообщениях было не так много «лучших практик», поскольку SO было относительно новым (более 5 лет назад) :) – Kelsey

1

Если вы добавляете целые числа, как вы говорите в своем вопросе, это добавит 50 (от 1 до 50):

for (int x = 1; x <= 50; x++) 
{ 
    list.Items.Add(x); 
} 

Вам не нужно устанавливать DisplayMember и ValueMember, если вы не добавляете объекты, у которых есть определенные свойства, которые вы хотите отобразить пользователю. В вашем примере:

listbox1.Items.Add(new { clan = "Foo", sifOsoba = 1234 }); 
+0

По какой-то причине, когда я добавляю строку в свою коллекцию элементов списка, список остается пустым , Есть ли что-то еще, что мне нужно сделать, чтобы текст появился? – James

2

так, как я это сделать - с помощью формата Event

MyClass c = new MyClass(); 
    listBox1.Items.Add(c); 

    private void listBox1_Format(object sender, ListControlConvertEventArgs e) 
    { 
     if(e.ListItem is MyClass) 
     { 
      e.Value = ((MyClass)e.ListItem).ToString(); 
     } 
     else 
     { 
      e.Value = "Unknown item added"; 
     } 
    } 

e.Value быть дисплея Текст

Тогда вы можете попытаться бросить SelectedItem в MyClass чтобы получить доступ ко всему, что у вас было там.
Также обратите внимание, что вы можете использовать что угодно (что наследует объект в любом случае (что почти все)) в коллекции предметов.

24

ListBoxItem - это класс WPF, а не класс WinForms.

Для WPF используйте ListBoxItem.

Для WinForms элемент является типом объекта, поэтому используйте один из следующих:
1. Предоставьте собственный метод ToString() для типа объекта.
2. Использование привязки данных с DisplayMemeber и ValueMember (see Kelsey's answer)

+0

Неправильное: http://msdn.microsoft.com/en-us/library/system.windows.controls.listboxitem.aspx – monksy

+4

@monksy, как это не правильно? В приведенной ссылке указано «Assembly: PresentationFramework (в PresentationFramework.dll)», что означает, что класс определен в WPF. Обычное приложение WinForms даже не ссылается на DLL WPF. –

+0

Я согласен с @AZ.Фактически чтение документации делает это совершенно ясным. – MichaelFStarke

1

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

ListBox.Items.Add("some text"); 
Смежные вопросы