2

我的 WinForms 应用程序中有一个 groupBox。这个 groupBox 中有大约 25 个组合框,用于选择各种选项/设置。它们都共享相同的项目集合(下拉项目)。默认情况下,它们都设置为不同的项目(没有 2 个组合框具有相同的文本)。

但是,我的应用程序的可定制性允许用户将设置更改为其他内容。我想要做的是当用户将 comboBoxSA 的选择索引更改为 3 并且已经选择 3 的另一个组合框(这将导致 2 个组合框显示相同的文本)以某种方式标记用户说设置不能重复。

当用户更改 selectionIndex 时,当用户尝试关闭表单时,这可能会立即发生,等等。我现在看到实现这一点的唯一方法是为每个组合框设置不同的 selectionIndex 更改函数,并将该组合框的文本与其他组合框中的每一个进行比较。

关于缩短这个的任何想法?

4

3 回答 3

0

好吧,我将从一个简单的方法开始,该方法确定任意数量的 ComboBoxes 是否包含任何重复项:

public static bool containsDuplicates(IList<ComboBox> boxes)
{
    return boxes.Count != 
        boxes.Select(box => box.SelectedValue) //TODO cast if needed, or use some other property
        .Distinct()
        .Count();
}

如果不同值的数量小于总数,则其中至少两个必须具有相同的值。

只需构建所有组合框的列表(可能排除任何尚未选择任何值的组合框)并将它们传递给此方法。

您可以在每个选定的索引更改事件中调用它(如果您有所有这些事件的集合,只需在开始时循环并将其添加到每个事件中)或在提交表单时调用它。(或两者。)

于 2013-01-03T21:48:14.313 回答
0

这个怎么样?将其设置为所有框的 SelectedIndexChanged 事件处理程序。

Dictionary<int, List<ComboBox>> indexToBoxes
Dictionary<ComboBox, int> boxToIndex 

void ComboBox_SelectedIndexChanged(object sender, EventArgs e)
{
    var box = (ComboBox)sender;
    var prevIndex = boxToIndex[box];
    boxToIndex[box] = box.SelectedIndex;

    if (indexToBoxes[prevIndex].Count == 2)
        //set boxes in set to normal
    indexToBoxes[prevIndex].Remove(box);

    indexToBoxes[box.SelectedIndex].Add(box);
    if (indexToBoxes[box.SelectedIndex].Count > 1)
        foreach (var box in indexToBoxes[box.SelectedIndex])
            //set boxes to alert indication, like background to red
}
于 2013-01-03T22:45:18.223 回答
0

这就是我所做的:

创建了一个组合框列表:

List<ComboBox> toolParameterComboBoxes = new List<ComboBox>();

将所有组合框添加到该列表中:

toolParameterComboBoxes.Add(countcomboBox);(重复...)

更改了所有组合框的 selectionIndexChanged 事件以使用它:

private void validateComboBox(object sender, EventArgs e)
{
  ComboBox thisCB = sender as ComboBox;
  if (thisCB.Text != "")
  {
       foreach (ComboBox cb in toolParameterComboBoxes)
       {
           if (thisCB.Name != cb.Name && thisCB.Text == cb.Text && thisCB.Text != "" && cb.Text != "")
           {
               MessageBox.Show("You cannot duplicate tool parameters." + "\r\n" + "\r\n" 
                            + "That option has been selected in " + cb.Name.Replace("comboBox", ""), "Error");
                        thisCB.SelectedIndex = 0;
                        break;
           }
        }
  }
}

这处理空的组合框。由于某种原因thisCB.Text = "";不起作用,所以我在他们的每个集合中添加了一个空的组合框项目,并简单地将选定的索引更改为 0,因此永远无法选择重复的项目。

于 2013-01-03T22:45:54.150 回答