0

在此处输入图像描述我有 6 个 C# 形式的组合框,它们都从同一列的数据库中填充。即用于使学生结果组合框填充主题名称。现在我想要的是如果已经在前一个组合框中选择了主题,如何从第二个组合框中删除主题名称。我使用组合框属性从数据库中填充每个组合框。

4

2 回答 2

1

首先,您可以通过以下方式创建一个List<ComboBox>并为每个ComboBox添加项目和SelectedValueChanged事件处理程序:

List<ComboBox> comboBoxes = new List<ComboBox>();
//here add your comboboxes to the list using the Add() method

foreach(ComboBox cb in comboboxes){
   cb.SelectedValueChanged += new EventHandler(comboBox_SelectedValueChanged);
   //add items to the ComboBox
}

然后,当事件被触发时,使用属性和方法SelectedValueChanged从其他 ComboBoxes 中删除选定的项目:SelectedItemItems.Remove()

private void comboBox_SelectedValueChanged(object sender, EventArgs e){
    //Fill the comboboxes
    ComboBox comboBox = (ComboBox)sender;
    if(comboBox.SelectedItem != null){
      foreach(ComboBox cb in comboboxes)
        cb.Items.Remove(comboBox.SelectedItem);
    }
}

PS:如果用户从 ComboBox 中多次选择元素,则此方法效果不佳,因为它将从其他 ComboBox 中删除它们。所以这只是一个例子,它给你一些关于如何开发它的建议。总而言之,你必须改进它。


编辑: 因为你可能有一些问题来解决这个问题,所以我为你改进了它:

private void comboBox_SelectedValueChanged(object sender, EventArgs e){
   foreach(ComboBox cb in comboBoxes){
      //Here listItems is a list of elements you added firstly to the comboboxes
      if(cb.Items.Count < listItems.Count)
         foreach(object item in listItems){ 
             if(!cb.Items.Contains(item))
               cb.Items.Add(item);
         }
      }
   }

   //Remove the selected items in all the comboboxes
   ComboBox comboBox = (ComboBox)sender;
   if(comboBox.SelectedItem != null){
      for(int i = 0; i < comboBoxes.Count; i++){
         for(int j = 0; j < comboBoxes.Count; j++){
            if(i != j && comboBoxes[j].SelectedItem != null && comboBoxes[j].Contains(comboBoxes[j].SelectedItem))
              comboBoxes[i].Items.Remove(comboBoxes[j].SelectedItem);
         }
      }
   }
}

如果你有太多的组合框,这可能会很慢,所以我试图让它尽可能快。但是在这种情况下,如果您有 6 个 ComboBox 控件,它应该可以很好地工作。

于 2012-11-08T21:09:25.293 回答
0

您需要有一个被选中的项目列表,然后在事件 selectedValueChanged() 之后,您必须删除旧的组合框值并再次填充每个组合框。

    List<object> coll = new List<Object>();
    List<Object> dbItems = new List<Object>();
    private void FillComboBox(object currSelected, ComboBox control)
    {
        control.Items.Clear();
        foreach (object c in dbItems)
        {
            if ((coll.Contains(c) == false) || (c == currSelected))
            {
                control.Items.Add(c);
            }
        }
        control.SelectedItem = currSelected;
    }
    private void SelectedItemChanged()
    {
        foreach (object c in coll) {
            if ((comboBox1.SelectedItem != null && c.Equals(comboBox1.SelectedItem)) ||
                (comboBox2.SelectedItem != null && c.Equals(comboBox2.SelectedItem)) ||
                (comboBox3.SelectedItem != null && c.Equals(comboBox3.SelectedItem)))
            {
            }else{
                coll.Remove(c);
            }
        }
    }

    private void comboBox1_SelectedValueChanged(object sender, EventArgs e)
    {
        // That code must be in every combobox_selectedValueChanged
        SelectedItemChanged();
        FillComboBox(coll, comboBox1);
        FillComboBox(coll, comboBox2);
        FillComboBox(coll, comboBox3);
    }

PS:对不起,但我不记得如何在组合框中获取以前选择的项目,所以当任何组合框选择的项目已更改时,我编写了附加方法。

于 2012-11-08T21:39:19.323 回答