如何在c#中验证组合框值

时间:2012-11-08 20:01:21

标签: c# .net winforms c#-2.0

enter image description here我有6个c#表单的组合框,它们都来自同一列的数据库。 i-e用于使学生成绩组合框填写科目名称。现在我想要的是如果在上一个组合框中已经选择了主题,如何从第二个组合框中删除主题名称。我使用组合框属性从数据库中填充每个组合框。

2 个答案:

答案 0 :(得分: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事件被触发时,使用SelectedItem属性和Items.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);
         }
      }
   }
}

如果你有太多的ComboBox,这可能会非常慢,所以我尽量让它更快。但是在这种情况下,你有6个ComboBox控件,它应该可以正常工作。

答案 1 :(得分: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:很抱歉,但我不记得如何在组合框中获取以前选择的项目,所以当任何组合框选定的项目被更改时,我会编写其他方法。