如何在C#和WinForms中向ListBox添加项?

34

我在WinForms中无法弄清如何向ListBox添加项目。

我尝试了:

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

如何将一个以int值为基础的列表与一些文本作为DisplayMember,添加ValueMember

list.Items.add(?)

顺便说一句,由于某些原因我无法使用ListBoxItem


@jmein:谢谢,我在整理原始帖子时错过了csharp标签。 - John Rudy
你可能想要查看这个SO的问题:C# - WinForms - 如何正确加载一个ListBox? - undefined
5
请勿使用已接受答案中提供的代码,它是错误的。Monksy建议使用的类(ListBoxItem)是WPF类,位于WPF命名空间(System.Windows.Controls)和WPF程序集(PresentationFramework.dll)中。Windows表单开发人员不应在其应用程序中引用来自WPF的程序集和类。该代码可能能够编译和运行,但是不正确。 - MichaelFStarke
9个回答

33

ListBoxItem 是 WPF 中的类,而不是 WinForms 类。

在 WPF 中,请使用 ListBoxItem。

在 WinForms 中,该项是 Object 类型,因此请使用以下方法之一:
1. 为 Object 类型提供自己的 ToString() 方法。
2. 使用 DisplayMember 和 ValueMember 进行数据绑定 (请参见 Kelsey 的答案)。


这不正确:http://msdn.microsoft.com/zh-cn/library/system.windows.controls.listboxitem.aspx - monksy
5
@monksy,为什么不正确?你提供的链接中写着Assembly: PresentationFramework (in PresentationFramework.dll),这意味着该类在WPF中定义。一个普通的WinForms应用程序甚至不会引用到WPF dll。 - AZ.
我同意 @AZ。实际上阅读文档会让很清楚明白。 - MichaelFStarke

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

ListBox的内部(默认)数据结构是ListBoxItem


7
listBoxItem?为什么我没有这个选项? - Ante
5
可以添加一个对象,它不一定是一个ListBoxItem。 - Philip Wallace
69
这不是正确的答案。问题标记为winforms,而ListBoxItem是一个WPF类。 - MichaelFStarke
7
看一下你链接的页面...它声明该类位于PresentationFramework程序集(在PresentationFramework.dll中),这是一个WPF程序集。不要管System.Windows.Controls是一个WPF命名空间的事实。Winforms的控件位于System.Windows.Forms命名空间中。 - MichaelFStarke
10
这个回答是错误的,Windows表单库中没有ListBoxItem类,只有WPF库有。 下面的回答是正确的。 - Torben
显示剩余3条评论

9
在 WinForms 中,当进行数据绑定列表时,会使用 ValueMemberDisplayMember 属性。如果您不需要数据绑定,则可以将任意对象添加为 ListItem
需要注意的是,为了显示该项,将调用其上的 ToString() 方法。因此,强烈建议仅向 ListBox 添加可以产生有意义输出的对象。

+1 需要调用 ToString(),对我帮助很大!(我的错,一开始没有覆盖 toString,现在我尽量为每个类这样做) - Spooks

8

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - Trilarion
1
如果这不是直接链接到StackOverflow,@triIarion会同意的。此外,这个答案是在SO相对较新(5年前)且没有太多“最佳实践”可供参考的时候发布的 :) - Kelsey

7

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));

如果您正在手动绑定,则可以使用goggles提供的示例。

5
如果你只是想在其中添加一个字符串,简单的答案是:
ListBox.Items.Add("some text");

5
我用的方法是使用“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,以便访问其中的任何内容。
另外请注意,您可以在Items集合中使用任何继承自对象的内容(几乎包括所有内容)。


我发现这个解决方案非常有用,因为我通常需要在组合框/列表框控件中显示键/值。谢谢! - Losbear

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 });

由于某种原因,当我将字符串添加到我的列表框项集合中时,列表框仍然为空白。我需要做些什么才能使文本出现? - James

1
你需要创建一个类型为ListBoxItem的项,并将其添加到Items集合中:
list.Items.add( new ListBoxItem("clan", "sifOsoba"));

4
方法ListBox.Items.Add()接受一个Object对象作为参数。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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接