我在ComboBoxStyle.DropDownList样式中有一个ComboBox。
这是根据传递的参数的数量动态创建的。这些字母是一个字母的ArrayList,它被添加到下拉列表中
for (int a = i; a < drivesLetters.Count; a++) //drivesLetters {"A", "K", "M", so on so forth}
{
combobox.Items.Add(drivesLetters[a]); //add driveletters at element i to the combobox
}
我一直在尝试创建一种方法,这样当我点击下拉列表时,其他下拉列表中已选中的字母不应显示在选择中。如上图所示,如果单击M,则M不应显示在当前选择了A和K的下拉列表中。如果我选择V,则应选择V,不在列表中显示,应添加M.
我的目标是让每个ComboBox都具有独特的价值。这是为了防止用户选择相同的字母&#34; A&#34;到两个ComboBox。
我不确定如何实际做到这一点。我想知道我是否应该有两个ArrayLists(一个包含下拉列表中使用的字母,另一个包含所有未使用的字母)。
我正在研究类似this (in javascript)的实现,但很明显在C#中。
请指点一个好的起点。我尝试了很多方法,但没有成功..
谢谢!
答案 0 :(得分:2)
我认为这样的事情应该能实现你的目标:
private void comboBox_SelectedItemChanged(object sender, EventArgs e)
{
ComboBox[] comboBoxes = { comboBox1, comboBox2, comboBox3 };
ComboBox senderBox = (ComboBox)sender;
char senderSelection = (char)senderBox.SelectedItem;
foreach (ComboBox comboBox in comboBoxes)
{
if (comboBox != senderBox)
{
char comboBoxSelection = (char)comboBox.SelectedItem;
comboBox.Items.Clear();
comboBox.Items.AddRange(_driveLetters.Where(
letter => letter != senderSelection).Cast<object>().ToArray());
comboBox.SelectedItem = comboBoxSelection;
}
}
}
...代码假定你的ComboBox被命名为comboBox1,comboBox2和comboBox3,_driveLetters
是一个实例成员IEnumerable<char>
(例如List,char []等),它们保持有效驱动字母显示。这一个事件处理程序将分配给所有三个ComboBox上的SelectedItemChanged事件。
显然,您可以调整变量名称和类型以适合您的特定目的。另外,我提前为任何拼写错误和编译器错误道歉。我只是在这里打字,没有编译或测试。我认为它足够接近可以让你前进的东西。 :)