2011-09-28 61 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内部字典。

您并不需要跟踪其他组合框中的当前选择,因为选择不会改变。

而且你可以通过使用这个类的多个实例来构建独特的组合框。