Отображение списка со списком дублируется после выбора

#c# #.net #winforms

#c# #.net #winforms

Вопрос:

У меня есть два программно созданных поля со списком ниже. Оба используют одни и те же элементы. Элементы состоят из яблока, банана, арбуза.

Список со списком 1 Изображение первого выпадающего списка

Выпадающий список 2 Изображение второго выпадающего списка

Как я могу сделать элемент уникальным, чтобы

  • Сценарий 1. При выборе «Apple» из выпадающего списка 1, в выпадающем списке 2 не будет отображаться «Apple».

  • Сценарий 2. При выборе «Банана» из выпадающего списка 2 в выпадающем списке 1 не будет отображаться «Банан»

Кроме того, это делается на C # с использованием приложения Winform.

  for (int i = 0; i < 2; i  )
 {
   ComboBox cb = new ComboBox();
   cb.Items.Add("Apple");
   cb.Items.Add("Banana");
   cb.Items.Add("Watermelon");
   cb.Name = "ComboBox"   i.ToString();

   cb.SelectedIndexChanged  = new EventHandler((object sender, EventArgs e) =>
           {
               for (int a = 0; a < 2; a  )
                {
                  ComboBox sequenceUpdate = (ComboBox)flowLayoutPanelA.Controls.Find(i, true)[0];
                  
                  
                }
           });
flowLayoutPanelA.Controls.Add(cb);
}
  

Ответ №1:

Вы должны определить Fruit класс и определить его коллекцию для повторного использования, возможно, даже репозиторий. Я просто написал самым простым способом, и приведенные ниже блоки пока заполняют счет.

 public partial class Form1 : Form {

    public Form1() {
        InitializeComponent();
        _fruits = new List<Fruit>{
            new Fruit(0, "--Choose--"),
            new Fruit(1, "Apple"),
            new Fruit(2, "Banana"),
            new Fruit(3, "Watermelon"),
        };

        LoadComponent(comboBox1, _fruits);
    }

    private readonly IEnumerable<Fruit> _fruits;

    private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
        LoadComponent(comboBox2, comboBox1.SelectedIndex == 0
                                 ? null
                                 : _fruits.Where(x => x.Id != Convert.ToInt32(comboBox1.SelectedValue)).ToList());
    }

    private void LoadComponent(ListControl control, IEnumerable<Fruit> source) {
        control.DataSource = source;
        control.ValueMember = "Id";
        control.DisplayMember = "Name";
    }
}

class Fruit {
    public Fruit(int id, string name) {
        Id = id;
        Name = name;
    }

    public int Id { get; set; }
    public string Name { get; set; }
}
  

Ответ №2:

Без какого-либо кода в вопросе невозможно дать вам ответ, который будет работать с вашим проектом.

Однако в общих чертах вы могли бы заполнить значения второго поля, используя .Событие OnChanged с первого, использующее что-то вроде этого:

 IList<string> boxASource = new List<string> { "Apple", "Banana", "Watermelon" };
string selectedValueA = boxASource[0];
IList<string> boxBSource = boxASource.Where(x => !x.Equals(selectedValueA)).ToList();