ListBox 不显示对 DataSource 的更改

Posted

技术标签:

【中文标题】ListBox 不显示对 DataSource 的更改【英文标题】:ListBox doesn't show changes to DataSource 【发布时间】:2010-12-09 05:38:02 【问题描述】:

我以为这是一个简单的问题,但我在网上找不到任何信息。我正在使用 BindingSource 将 ListBox 绑定到 List,如下所示:

List<Customer> customers = MyMethodReturningList();

BindingSource customersBindingSource = new BindingSource();
customersBindingSource.DataSource = customers;

customersListBox.DataSource = customersBindingSource;

现在,当我在customers 列表中添加或删除时,我的ListBox 会更新(即使没有在BindingSource 上使用ResetBindings),但如果我更改列表中的任何客户对象,它确实会不是。调用ResetBindings 无效。我什至实现了自己的BindingList,但行为没有改变。Customer 类使用属性来访问和修改数据。它的ToString() 内容显示在列表中。

我在 .Net 2.0 中使用 C#。

有什么想法吗?

谢谢

【问题讨论】:

【参考方案1】:

我知道这个问题是在大约 6 年前提出的,但除了变通方法之外,我在这里没有看到正确的答案。 当您更改集合中项目的属性时,会针对元素(对象)而不是集合引发事件。所以集合看不到变化,也不会刷新绑定的控件。所有绑定集合和大多数通用集合(如List&lt;&gt;)中的元素接收2 个事件,PropertyChangingPropertyChanged。当集合内元素的属性发生更改时,将触发事件。您需要做的就是添加一个事件处理程序,该处理程序将触发重新绑定或在Collection 上引发事件。

【讨论】:

【参考方案2】:

我通过在更新源时将数据转换为数组来解决这个问题。请参阅 UpdateData 方法。这样您就可以在不丢失 ComboBox 设置的情况下更新您的组合框。

class Person 
   public int Id get; set; 
   public string FirstName get; set; 
   public string SurName get; set; 


public Form1()

    InitializeComponent();
    comboBox1.DisplayMember = "FirstName";
    comboBox1.ValueMember = "Id";
    comboBox1.DataSource = m_PersonList;


public void UpdateData() 
    m_PersonList[0].FirstName = "Firstname1";
    comboBox1.DataSource = m_PersonList.ToArray<Person>();

【讨论】:

【参考方案3】:

如果您使用BindingList,您甚至不需要BindingSource

BindingList<Customer> customers = new BindingList<Customer>(MyMethodReturningList());
customersListBox.DataSource = customers;

【讨论】:

【参考方案4】:

列表框中还有一个可能导致此问题的错误。如果将 SelectionMode 设置为 None,则会出现此问题。

作为一种变通方法,我将选择模式设置为 One,然后在更新数据源时设置回 None。

【讨论】:

【参考方案5】:

好的,这是一个肮脏的修复:如果您需要刷新框内容 set datasource = null,然后重新绑定它。

它不更新的原因是列表中的对象没有改变,它只检查对象的引用而不是它们的内容。

【讨论】:

是的,我想这就是我最后所做的(我现在还没有代码),但正如你所说,它很脏。 另一个问题是,数据源丢失了它的设计时间设置,例如DisplayMember 和 ValueMember 属性未设置。

以上是关于ListBox 不显示对 DataSource 的更改的主要内容,如果未能解决你的问题,请参考以下文章

DataSource绑定DataTable.Select()显示system.data.DataRow问题解决的方法

数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化

DataBind listBox 选定项到文本框

wpf listbox 显示不全 而且没滚动条

wpf listbox 显示不全 而且没滚动条

C#中的列表框刷新()