C#DropDown智能逻辑

时间:2014-10-21 04:28:46

标签: c# winforms arraylist dropdownlistfor

我在ComboBoxStyle.DropDownList样式中有一个ComboBox。

enter image description here

这是根据传递的参数的数量动态创建的。这些字母是一个字母的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#中。

请指点一个好的起点。我尝试了很多方法,但没有成功..

谢谢!

1 个答案:

答案 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事件。

显然,您可以调整变量名称和类型以适合您的特定目的。另外,我提前为任何拼写错误和编译器错误道歉。我只是在这里打字,没有编译或测试。我认为它足够接近可以让你前进的东西。 :)