我有 6 个 C# 形式的组合框,它们都从同一列的数据库中填充。即用于使学生结果组合框填充主题名称。现在我想要的是如果已经在前一个组合框中选择了主题,如何从第二个组合框中删除主题名称。我使用组合框属性从数据库中填充每个组合框。
问问题
11071 次
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 中删除选定的项目: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);
}
}
}
}
如果你有太多的组合框,这可能会很慢,所以我试图让它尽可能快。但是在这种情况下,如果您有 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 回答