列表与列表框同步?

时间:2011-03-21 07:56:28

标签: c# winforms list listbox synchronization

我的WinForms上有一个列表框,用户可以上下移动项目,列表框和我的列表一样,我想知道保持两个同步的最有效方法是什么。

例如将项目向下移动我有:

int i = this.recoveryList.SelectedIndex;
object o = this.recoveryList.SelectedItem;

if (i < recoveryList.Items.Count - 1)
{
  this.recoveryList.Items.RemoveAt(i);
  this.recoveryList.Items.Insert(i + 1, o);
  this.recoveryList.SelectedIndex = i + 1;
}

我有:

public List<RouteList> Recovery = new List<RouteList>();

我希望在列表框中保持更新。

我应该简单地清除恢复并使用当前列表框数据进行更新,还是有更好的方法在上下移动时更新两者?

我主要是因为从列表框到列表的类型不同。

2 个答案:

答案 0 :(得分:2)

正确的方法是更改​​底层对象,然后让UI Control对该更改做出反应。

要使ListBox对对象集合(列表)中的更改作出反应,您需要使用ObservableCollection。它就像收集的INotifyPropertyChanged。

然后,您的上/下操作会更改集合,而不是UI。

修改

我不是说要在集合的TOP上添加一个观察者。我是想改变你收藏的类型。不要使用List,使用ObservableCollection。它(大部分)以相同的方式工作,但通知绑定的UI控件对其项目的更改。

至于一个例子,请谷歌吧。无论如何,这就是我必须做的事情。

答案 1 :(得分:2)

.Net为此类行为提供内置支持。要使用它,您需要将恢复列表的类型更改为:

public BindingList<RouteList> Recovery = new BindingList<RouteList>();

然后在控件中使用该BindingList作为DataSource:

listBox1.DataSource = Recovery;

这是一个使用String的BindingList的简单示例。我在表单上有两个listBox,它们都保持同步,因为所选元素与列表中的第一个元素交换:

public partial class Form1 : Form
{
    private readonly BindingList<string> list = new BindingList<string> { "apple", "pear", "grape", "taco", "screwdriver" };

    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = list;
        listBox2.DataSource = list;
    }

    private void listBox1_KeyUp(object sender, KeyEventArgs e)
    {
        var tmp = list[0];
        list[0] = list[listBox1.SelectedIndex];
        list[listBox1.SelectedIndex] = tmp;
    }
}