【问题标题】:Trouble binding a BindingList to ListBox无法将 BindingList 绑定到 ListBox
【发布时间】:2009-12-16 20:57:47
【问题描述】:

在我正在开发的应用程序中,我需要维护一个当前加载的项目列表,并在 ListBox 中显示每个项目的名称(好的,多个 ListBox,但这既不是这里也不是那里)。

class Project
{
    public String Name;

    // Etc. etc...
}

我有一个 BindingList 对象,其中包含所有已加载的项目,并将其绑定到我的 ListBox。

private BindingList<Project> project_list = new BindingList<Project>();
private ListBox project_listbox;

private void setList()
{
    project_listbox.DisplayMember = "Name";
    project_listbox.ValueMember = "Name";
    project_listbox.DataSource = project_list;
}

但是,当我这样做时,project_listbox 中显示的所有内容都是项目的一组类名。我在这里错过了什么吗?我能找到的关于将列表绑定到 ListBox 的每个参考都使用了非常相似的设置。

【问题讨论】:

  • 默认情况下,列表框将在您的类上调用 ToString() 以获取显示值。您可以轻松实现 public Override ToString() 并返回 Name 作为字符串结果。
  • 如果您希望某个属性成为 ValueMember,这是一个糟糕的解决方案:) 您仍然需要创建一个 {get;私人集}。否则,ValueMember 将不起作用。

标签: c# .net winforms listbox


【解决方案1】:

您需要使属性可读:)

class Project
{
    public string Name {get; private set;}

    // Etc. etc...
}

现在应该可以了。我刚刚测试过。

这应该也可以:

public readonly string Name;

正如我已经指出的那样。放置“只读”是行不通的。我只是自己测试并验证了它。

【讨论】:

  • 属性+1,但忘记只读字段。 DisplayMember 必须是属性的名称。
  • 谢谢。这行得通,尽管我不清楚为什么这在功能上与我以前的不同。 ValueMember 属性是否仅在 set 为私有时才有效?
  • 不不,只是一种习惯 :) 您通常不希望其他类简单地将您的属性设置为任何感觉。它实际上是我已应用于该属性的“只读”。
【解决方案2】:

顺便说一句,如果你想在 BindingList 上搜索或排序,你需要实现它并添加这个功能

http://msdn.microsoft.com/en-us/library/ms993236.aspx

【讨论】:

    【解决方案3】:

    一个可能的问题是新项目没有插入到 BindingList 中,而是插入到其父列表中

    【讨论】:

      猜你喜欢
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      相关资源
      最近更新 更多