【问题标题】:Databinding to List - See changes of data source in ListBox, ComboBox数据绑定到 List - 查看 ListBox、ComboBox 中数据源的变化
【发布时间】:2019-06-07 22:22:12
【问题描述】:

我希望ListBox 在我将对象删除或添加到我用作其DataSource 的列表中时自动显示更改。

如何将List<T> 连接到ListBox 并立即查看ListBox 中基础列表的变化?

【问题讨论】:

  • @Sayse 我认为问题不是该链接的重复 :) 该链接的重点是将 List<T> 设置为 DataSource 但 OP 需要查看其列表中的更改ListBox 这意味着他应该使用IBindingListBindingList 的实现。
  • @RezaAghaei - 该问题中接受的答案提到了这一点,但是是的,它没有解释它。无论哪种方式,操作都不需要很长时间才能找到重复项...“winforms 数据绑定列表”将该重复项作为其第一个结果
  • @Sayse 感谢您的反馈,我认为我的回答对用户来说更直接。希望你也觉得它有用:)

标签: c# winforms list data-binding listbox


【解决方案1】:

Windows Forms中,如果你想在绑定列表控件中看到数据源的变化,比如ComboBoxListBoxDataGridView(复杂的双向数据绑定),你应该使用一个实现IBindingList接口作为数据绑定的DataSource的类。最合适的实现是BindingList<T>。这样,您的控件底层数据源中的每个添加/删除操作都将立即在控件中可见。

请记住,使用BindingList<T> 允许绑定控件查看添加或删除的项目,但也可以立即查看属性更改,T 应该实现INotifyPropertyChanged。这样您的控件就会收到PropertyChanged 的通知并始终显示最新数据。

注 1 - ObservableCollection 是否解决双向数据绑定问题?

在 Windows 窗体中,一个常见的错误是使用 ObservableCollection,因为它没有实现 IBindingList,因此无法满足此要求。

注 2 - BindingSource 是否解决双向数据绑定问题?

如果BindingSource 的底层数据源没有实现IBindingList<T> 就不能解决双向数据绑定问题。您需要通知控件从绑定源重新加载数据,因此您可以调用BindingSourceResetBindings 方法。这样,绑定控件将从数据源重新加载数据并显示最新数据:

this.bindingSource1.ResetBindings(false);

注意 3 - 我应该使用 List<T>。如何使用List<T> 解决问题?

如果您必须使用List<T>,那么您可以在需要时重置列表框的数据绑定,例如在每次更改后您应该将其DataSource 分配为null,然后再次分配给数据列表:

this.listBox1.DataSource = null;
this.listBox1.DataSource = list;

【讨论】:

    【解决方案2】:

    请参阅以下示例,其中将字符串列表传递到 listBox 实例。

    public partial class Form1 : Form
    {
    List<string> _items = new List<string>(); // <-- Add this
    
    public Form1()
    {
        InitializeComponent();
    
        _items.Add("One"); // <-- Add these
        _items.Add("Two");
        _items.Add("Three");
    
        listBox1.DataSource = _items;
    }
    }
    

    【讨论】:

    • List&lt;T&gt;不适用于需要查看数据源变化的情况。
    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2018-07-19
    • 2011-03-07
    • 2011-09-19
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多