【问题标题】:ListBox doesn't show changes to DataSourceListBox 不显示对 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#。

有什么想法吗?

谢谢

【问题讨论】:

    标签: data-binding listbox c#-2.0


    【解决方案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 属性未设置。
            猜你喜欢
            • 2017-05-23
            • 2015-10-15
            • 2015-07-20
            • 2011-08-22
            • 1970-01-01
            • 2016-09-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多