我的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 :(得分: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;
}
}