在我的项目中,我有大约100个组合框,每个组合框都包含相同的项。我想像这样“更新”每个组合框:
当在组合框A中选择一个项目时,所有其他组合框不再包含此项目。同样,当组合框A中的选定项再次更改时,前一项应该再次出现在其他组合框中,依此类推,我希望每个组合框都会发生这种情况。
实现这一目标的最佳方法是什么?如果可能的话,使用尽可能少的代码和没有计时器。
发布于 2011-09-29 16:04:14
使用处理更改并跟踪当前选定项的帮助器类。如下所示:
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 方法添加所有组合框,如下所示:
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内部字典。
您不需要跟踪其他组合框中的当前选择,因为那里的选择不会更改。
您可以通过使用该类的多个实例来构建不同的组合框组。
发布于 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
发布于 2011-09-29 07:03:10
单向的..。
我认为你需要三个列表: AvailableItems,SelectedItems和ComboBoxes。
当选择一个项目时,将其从AvailableItems中取出并放入SelectedItems中。然后迭代ComboBoxes并将它们重新绑定到AvailableItems。
棘手的部分是让每个ComboBox保留它选择的项目。在重新绑定之前,保存它的选定项,执行重新绑定,将选定项放回原处并重新选择它。
当所有这些都发生的时候,你可能需要做一个Suspendlayout()来避免屏幕更新。
https://stackoverflow.com/questions/7590129
复制相似问题