首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新多个ComboBoxes

更新多个ComboBoxes
EN

Stack Overflow用户
提问于 2011-09-29 05:59:37
回答 3查看 816关注 0票数 0

在我的项目中,我有大约100个组合框,每个组合框都包含相同的项。我想像这样“更新”每个组合框:

当在组合框A中选择一个项目时,所有其他组合框不再包含此项目。同样,当组合框A中的选定项再次更改时,前一项应该再次出现在其他组合框中,依此类推,我希望每个组合框都会发生这种情况。

实现这一目标的最佳方法是什么?如果可能的话,使用尽可能少的代码和没有计时器。

EN

回答 3

Stack Overflow用户

发布于 2011-09-29 16:04:14

使用处理更改并跟踪当前选定项的帮助器类。如下所示:

代码语言:javascript
运行
复制
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;
    }
}

通过 Add 方法添加所有组合框,如下所示:

代码语言:javascript
运行
复制
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处理程序,以便在更改时得到通知。

在选择更改的情况下,它会检查此组合框是否有先前选择的值(使用内部字典结构)。然后,它迭代所有的组合框并更改项,即。删除新选择的框,并将旧框添加到除具有更改的框之外的所有框中。最后,它更新ints内部字典。

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

您可以通过使用该类的多个实例来构建不同的组合框组。

票数 1
EN

Stack Overflow用户

发布于 2011-09-29 06:22:20

我会在ComboBox上用DataBinding试一下,这样我就不必控制ComboBoxs本身了。

您可以通过直接控制源来控制ComboBox数据。

所以只在DataSource中显示一个未标记的DataEntry,或者类似的东西。

DataBinding示例:

http://msdn.microsoft.com/en-us/library/x8ybe6s2%28v=vs.80%29.aspx

票数 0
EN

Stack Overflow用户

发布于 2011-09-29 07:03:10

单向的..。

我认为你需要三个列表: AvailableItems,SelectedItems和ComboBoxes。

当选择一个项目时,将其从AvailableItems中取出并放入SelectedItems中。然后迭代ComboBoxes并将它们重新绑定到AvailableItems。

棘手的部分是让每个ComboBox保留它选择的项目。在重新绑定之前,保存它的选定项,执行重新绑定,将选定项放回原处并重新选择它。

当所有这些都发生的时候,你可能需要做一个Suspendlayout()来避免屏幕更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7590129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档