0

ここに画像の説明を入力してください私はc#フォームに6つのコンボボックスを持っており、それらはすべて同じ列のデータベースから入力されます。つまり、学生の結果コンボボックスに科目名を入力させるためです。今私が欲しいのは、前のコンボボックスでサブジェクトがすでに選択されている場合に2番目のコンボボックスからサブジェクト名を削除する方法です。そして、コンボボックスプロパティを使用してデータベースから各コンボボックスを埋めます。

4

2 に答える 2

1

まず、次の方法でアイテムとイベントハンドラーをList<ComboBox>追加します。ComboBoxSelectedValueChanged

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を使用して、選択したアイテムを他のコンボボックスから削除します。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);
         }
      }
   }
}

ComboBoxが多すぎると、これは非常に遅くなる可能性があるため、できるだけ速くするようにしました。ただし、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 に答える