2011-09-28 106 views
0

在我的項目中,我有大約100個組合框,每個組合框都包含相同的項目。我想要像這樣「更新」每個組合框:更新多個組合框

當在組合框A中選擇某個項目時,所有其他組合框都不應該包含此項目。同樣,當組合框A中的選定項目再次發生變化時,以前的項目應該再次出現在其他組合框中,等等,我希望這發生在每個單獨的組合框中。

完成此操作的最佳方法是什麼?如果可能,使用更少的代碼和計時器。

+0

你是否有動態創建的所有組合框,因此已經存在於列表/集合中,或者你如何想象在表單中找到它們? –

+0

所有的都是在設計時創建的,每個組合框現在可以保存與組合框一樣多的項目。從其他組合框中刪除選定的項目不是最大的問題,我只是無法弄清楚當comboBox再次更改其選定的項目時如何讀取它們。 – makulu

回答

0

一種方法....

我想你需要三個列表:AvailableItems,SelectedItems和組合框。

當一個項目被選中時,你將它從AvailableItems中取出並放入SelectedItems中。然後迭代ComboBox並將每個重新綁定到AvailableItems。

棘手的部分是每個組合框保持它的選定項目。重新綁定之前,保存所選項目,重新綁定,將選定項目放回並重新選擇它。

您可能需要在發生所有這些情況時執行Suspendlayout(),以避免屏幕更新。

1

使用幫助程序類來處理更改並跟蹤當前選定的項目。事情是這樣的:

public class ComboboxSwitcher 
{ 
    List<ComboBox> boxlist = new List<ComboBox>(); 
    Dictionary<ComboBox, object> olditems = new Dictionary<ComboBox, object>(); 

    public void Add(params ComboBox[] boxes) 
    { 
     boxlist.AddRange(boxes); 
     boxes.ToList().ForEach(box => box.SelectedIndexChanged += handler); 
    } 

    private void handler(object sender, EventArgs e) 
    { 
     ComboBox trigger = (ComboBox) sender; 
     object item = trigger.SelectedItem; 
     object olditem = null; 
     if (olditems.ContainsKey(trigger)) olditem = olditems[trigger]; 

     boxlist.ForEach(box => 
          { 
           if (box != trigger) 
           { 
            if (olditem != null) box.Items.Add(olditem); 
            box.Items.Remove(item); 
           } 
          }); 

     olditems[trigger] = item; 
    } 
} 

通過添加的所有組合框中添加方法是這樣的:

List<string> items = new List<string> { "A", "B", "C", "D" }; 
comboBox1.Items.AddRange(items.ToArray()); 
comboBox2.Items.AddRange(items.ToArray()); 
comboBox3.Items.AddRange(items.ToArray()); 
new ComboboxSwitcher().Add(comboBox1, comboBox2, comboBox3); 

類註冊了一個的SelectedIndexChanged處理所有組合框被告知的變化。

如果選擇更改,它將檢查此combox是否有先前選定的值(使用內部字典結構)。然後迭代所有組合框並更改項目,即。刪除新選中的一個,並將舊的添加到除變更框外的所有框中。最後它更新ints內部字典。

您並不需要跟蹤其他組合框中的當前選擇,因爲選擇不會改變。

而且你可以通過使用這個類的多個實例來構建獨特的組合框。