Используйте вспомогательный класс, который обрабатывает изменения и отслеживает текущие выбранные элементы.Примерно так:
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.
Вам не нужно было отслеживать текущие выделения в других списках, так как выбор там не меняется.
И вы можете создавать отличительные группы списков с помощьюиспользуя несколько экземпляров этого класса.