2011-03-21 139 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