在我的项目中,我有大约100个组合框,每个组合框都有相同的项目。我想像这样“更新”每个组合框:
在组合框A中选择某个项目时,所有其他组合框不应再保留此项目。同样,当组合框A中的所选项目再次发生变化时,前一项应该再次出现在其他组合框等上,我希望每个组合框都能实现这一点。
实现这一目标的最佳方法是什么?如果可能的话,使用更少的代码和没有定时器。
答案 0 :(得分: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的先前选择的值(使用内部字典结构)。然后它迭代所有组合框并更改项目,即。删除新选择的一个并将旧的一个添加到除了具有更改的框之外的所有框。最后它更新了内部字典。
您不需要跟踪其他组合框中的当前选择,因为选择没有变化。
您可以通过使用此类的多个实例来构建独特的组合框组。
答案 1 :(得分:0)
我会在ComboBox上使用DataBinding尝试它,所以我不必控制ComboBox本身。
您可以通过直接控制源来控制ComboBox数据
因此,只在DataSource中显示未标记的DataEntry,或者类似的东西
DataBinding示例:
http://msdn.microsoft.com/en-us/library/x8ybe6s2%28v=vs.80%29.aspx
答案 2 :(得分:0)
单程......
我认为你需要三个列表:AvailableItems,SelectedItems和ComboBoxes。
选择某个项目后,将其从AvailableItems中取出并将其放入SelectedItems中。然后迭代ComboBox并将每个重新绑定到AvailableItems。
棘手的部分是让每个ComboBox保持它的选定项目。在重新绑定之前,保存它的所选项目,进行重新绑定,将所选项目放回并重新选择它。
在发生这一切时,您可能需要执行Suspendlayout()以避免屏幕更新。