2011-03-21 137 views
3

我在我的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>(); 

,我想保持对列表框更新。

我应该简单清楚使用当前列表框数据恢复和更新,还是有更好的方法来更新上下移动?

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

+0

您使用的是WPF还是WinForms? – 2011-03-21 08:35:35

+0

@Daniel WinForms,thakns询问。 – Prix 2011-03-21 08:36:08

回答

2

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

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

然后您使用的BindingList为您的控件的数据源:

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; 
    } 
} 
+0

真棒,感谢您花时间。 – Prix 2011-03-21 11:31:35

2

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

对于ListBox对对象集合(您的List)中的更改作出反应,您需要改为使用ObservableCollection。它就像集合的INotifyPropertyChanged一样。

然后你让你的上/下动作改变集合,而不是UI。

编辑

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

举一个例子,请Google为它。这就是我不得不提供的一种方法。

+0

@Vicent Vancalbergh谢谢你的回复,我明白你的意思,在这里让观察者在集合之上更新列表框,我认为这是最好的,但我不确定如何将它应用到实践中,也许如果你可以指点我一个例子或做一个样本,我将不胜感激,最好的问候。 – Prix 2011-03-21 09:30:20

+0

@Vincent - 我不认为ObservableCollection提供了订购通知。 – 2011-03-21 11:00:47

+0

@Ritch:好吧,考虑到这里的重新排序发生RemoveAt()和插入()它应该工作..另请参见:http://msdn.microsoft.com/en-us/library/ms654931.aspx – 2011-03-21 11:15:37