更新多个组合框
在我的项目中,我有大约100个组合框,每个组合框都包含相同的项目。我想要像这样“更新”每个组合框:更新多个组合框
当在组合框A中选择某个项目时,所有其他组合框都不应该包含此项目。同样,当组合框A中的选定项目再次发生变化时,以前的项目应该再次出现在其他组合框中,等等,我希望这发生在每个单独的组合框中。
完成此操作的最佳方法是什么?如果可能,使用更少的代码和计时器。
我会试试ComboBox上的DataBinding,所以我不必去控制ComboBoxs本身。
您可以通过直接控制源来控制组合框数据。
所以只能在DataSource中显示一个未标记的DataEntry,或类似的东西。
样品的数据绑定:
http://msdn.microsoft.com/en-us/library/x8ybe6s2%28v=vs.80%29.aspx
一种方法....
我想你需要三个列表:AvailableItems,SelectedItems和组合框。
当一个项目被选中时,你将它从AvailableItems中取出并放入SelectedItems中。然后迭代ComboBox并将每个重新绑定到AvailableItems。
棘手的部分是每个组合框保持它的选定项目。重新绑定之前,保存所选项目,重新绑定,将选定项目放回并重新选择它。
您可能需要在发生所有这些情况时执行Suspendlayout(),以避免屏幕更新。
使用帮助程序类来处理更改并跟踪当前选定的项目。事情是这样的:
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内部字典。
您并不需要跟踪其他组合框中的当前选择,因为选择不会改变。
而且你可以通过使用这个类的多个实例来构建独特的组合框。
你是否有动态创建的所有组合框,因此已经存在于列表/集合中,或者你如何想象在表单中找到它们? –
所有的都是在设计时创建的,每个组合框现在可以保存与组合框一样多的项目。从其他组合框中删除选定的项目不是最大的问题,我只是无法弄清楚当comboBox再次更改其选定的项目时如何读取它们。 – makulu