我有6个c#表单的组合框,它们都来自同一列的数据库。 i-e用于使学生成绩组合框填写科目名称。现在我想要的是如果在上一个组合框中已经选择了主题,如何从第二个组合框中删除主题名称。我使用组合框属性从数据库中填充每个组合框。
答案 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:很抱歉,但我不记得如何在组合框中获取以前选择的项目,所以当任何组合框选定的项目被更改时,我会编写其他方法。