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<>
)中的元素接收2 个事件,PropertyChanging
和PropertyChanged
。当集合内元素的属性发生更改时,将触发事件。您需要做的就是添加一个事件处理程序,该处理程序将触发重新绑定或在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问题解决的方法