Обновление нескольких комбинированных списков - PullRequest
0 голосов
/ 29 сентября 2011

В моем проекте у меня есть около 100 комбинированных списков, каждый из которых содержит одинаковые элементы. Я хочу «обновить» каждый выпадающий список следующим образом:

Если в выпадающем списке A выбран элемент, все остальные выпадающие списки больше не должны его содержать. Аналогичным образом, когда выбранный элемент из комбинированного списка A снова изменяется, предыдущий элемент должен снова появиться в других комбинированных списках и т. Д., И т. Д., И я хочу, чтобы это происходило для каждого отдельного комбинированного списка.

Какой лучший способ сделать это? По возможности с меньшим количеством кода и без таймеров.

Ответы [ 3 ]

1 голос
/ 29 сентября 2011

Используйте вспомогательный класс, который обрабатывает изменения и отслеживает текущие выбранные элементы.Примерно так:

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.

Вам не нужно было отслеживать текущие выделения в других списках, так как выбор там не меняется.

И вы можете создавать отличительные группы списков с помощьюиспользуя несколько экземпляров этого класса.

0 голосов
/ 29 сентября 2011

В одну сторону ....

Я думаю, вам нужно три списка: AvailableItems, SelectedItems и ComboBox.

Когда элемент выбран, вы берете его из AvailableItems и помещаете его вSelectedItems.Затем выполните итерацию ComboBox и перепривязайте каждый из них к AvailableItems.

Сложная часть заключается в том, чтобы каждый ComboBox сохранял свой выбранный элемент.Перед повторной привязкой сохраните выбранный элемент, выполните повторную привязку, поместите выбранный элемент обратно и повторно выберите его.

Возможно, вам потребуется выполнить Suspendlayout (), пока все это происходит, чтобы избежать обновления экрана.

0 голосов
/ 29 сентября 2011

Я бы попробовал это с привязкой данных на ComboBox, поэтому мне не нужно самому управлять ComboBox.
Вы можете управлять данными ComboBox, напрямую управляя источником.
Поэтому показывайте только неотмеченный объект DataEntry в источнике данных или что-то в этом роде.
Образец для привязки данных:
http://msdn.microsoft.com/en-us/library/x8ybe6s2%28v=vs.80%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...