Предотвращение выделения одного и того же значения в отдельных выпадающих списках в форме C # - PullRequest
0 голосов
/ 15 июня 2011

Я создаю приложение формы в c #.У меня есть от 6 до 12 различных комбинированных списков (различающихся в зависимости от других параметров, специфичных для этой программы, но это не имеет значения), каждый из которых имеет одинаковые 6 вариантов выбора.выбрать один и тот же элемент в нескольких списках?

Ответы [ 2 ]

1 голос
/ 15 июня 2011

Что если вы просто создадите метод для обработки события SelectedIndexChanged для полей со списком, настройте их все для использования одного и того же метода и выполните небольшую проверку, например, так:

private void TestUniqueSelection(object sender, System.EventArgs e)
{
      var controls = new List<System.Windows.Forms.ComboBox>();
      controls.Add(...); // <-- Add all of your controls here.

      ComboBox changedBox = (ComboBox) sender;

      if (controls
           .Where(a => a != changedBox && a.SelectedItem == changedBox.SelectedItem)
           .Count() > 0)
           MessageBox.Show("Selected Option has already been chosen");
}

Очевидно, что вы могли бы сделать его более эффективным, если бы List <...> был закрытой переменной-членом и устанавливал ее только один раз, но я хотел быть кратким и понятным в примере кода.

0 голосов
/ 15 июня 2011

У вас есть 2 варианта, которые я могу предложить с руки;упреждающий и отзывчивый.

@ Стив дал быстрый пример отзывчивого (отреагируйте на событие выбора и убедитесь, что оно не дублируется)

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

    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace SO_Forms_Demo
    {
        public partial class ComboBoxes : Form
        {
            public ComboBoxes()
            {
                InitializeComponent();
            }
    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
                //do whatever else you want to do here....

                removeDuplicateValues((ComboBox)sender, ((ComboBox)sender).SelectedItem.ToString());
            }

//....Through ...//
            private void comboBox6_SelectedIndexChanged(object sender, EventArgs e)
            {
                //do whatever else you want to do here....

                removeDuplicateValues((ComboBox)sender, ((ComboBox)sender).SelectedItem.ToString());
            }

            private void removeDuplicateValues(ComboBox sender, string value)
            {
                //get all of the comboboxes in a collection
                List<ComboBox> comboboxes = this.Controls.OfType<ComboBox>().ToList<ComboBox>();
                foreach (ComboBox cb in comboboxes)
                {
                    if (cb != sender)
                    {
                        cb.Items.Remove(value);
                    }
                }
            }
        }
    }

как только у вас есть это место, есть много способов сделать его более устойчивым (отследить предыдущие значения и вставитьих обратно, если внесены изменения и т. д.), но это отвечает на ваш основной вопрос.

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