【问题标题】:Binding (and refreshing) a List<T> to a ListBox将 List<T> 绑定(并刷新)到 ListBox
【发布时间】:2013-07-05 10:33:51
【问题描述】:

我有两个 ListBox,我想在它们之间移动项目。代码如下所示:

    private void FillItems()
    {
        allItems = GetAllItems();
        availableItems = new List<string>(allItems);
        selectedItems = new List<string>();

        itemsListBox.DataSource = availableItems;
        selectedItemsListBox.DataSource = selectedItems;
    }

    private void addItemButton_Click(object sender, EventArgs e)
    {
        var itemsToAdd = itemsListBox.SelectedItems;
        foreach (string item in itemsToAdd)
        {
            availableItems.Remove(item);
            selectedItems.Add(item);
        }
    }

足够简单。我将字符串从一个列表移动到另一个列表。

现在这不起作用,就像它不应该一样。我意识到它缺少某种通知集合更改的方式。所以我尝试了这些选项:

  1. 在列表框上调用Refresh()。没用。

  2. 使用额外的数据绑定层 (BindingSource)。也无济于事。

  3. 在控件上调用ResetBindings()。还是什么都没有。

我在这里做错了什么?我应该使用某种可观察的集合吗?

【问题讨论】:

    标签: c# winforms data-binding collections


    【解决方案1】:

    如果你导入 System.ComponentModel 命名空间,那么你可以使用一个字符串的绑定列表,它会在更改时自动引发事件:

    private void FillItems()
    {
        allItems = GetAllItems();
        availableItems = new BindingList<string>(allItems);
        selectedItems = new BindingList<string>();
    
        itemsListBox.DataSource = availableItems;
        selectedItemsListBox.DataSource = selectedItems;
    }
    
    private void addItemButton_Click(object sender, EventArgs e)
    {
        object itemsToAdd = itemsListBox.SelectedItems;
        foreach (string item in itemsToAdd) {
            availableItems.Remove(item);
            selectedItems.Add(item);
        }
    }
    

    此链接包含有关可观察集合和绑定列表之间区别的更多信息。 difference between ObservableCollection and BindingList

    【讨论】:

    • 工作。为了后代:我不得不将SelectedItems 重写为单独的列表,因为集合发生了变化,导致foreach 崩溃。
    【解决方案2】:

    我更喜欢使用 ObservableCollections 因为你不需要自己刷新绑定,看看

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

    【讨论】:

      【解决方案3】:

      你也可以使用BindingList

      BindingList 和 ObservableCollection 之间的差异解释 here)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-03
        • 2016-04-18
        • 2015-09-01
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2012-03-17
        相关资源
        最近更新 更多