以编程方式取消选中基于选择的框

时间:2014-04-07 16:22:41

标签: c# arrays

我有两个(或更多单词)我希望复选框状态为“已选中”或“未选中”

当数组第二次循环时,它会撤消数组中第一个索引的选择。

    String[] Others = { "Conference", "Calendar" };
    filterSelection(Others);




    private void filterSelection(String location)
    {
        for (int i = 0; i < checkBoxArray.Length; i++)
        {
            checkBox = checkBoxArray[i];
            if (checkBox.Text.Contains(location))
            {
                checkBox.CheckState = CheckState.Checked;
            }
            else
            {
                checkBox.CheckState = CheckState.Unchecked;
            }
            checkBoxArray[i] = checkBox;
        }
    }

    private void filterSelection(String[] location)
    {
        for(int i=0; i<location.Length; i++)
        {
            filterSelection(location[i]);
        }
    }

无论如何我可以根据数组中的单词打开和关闭复选框吗? (如果你有更好的想法,请提供理由)。

1 个答案:

答案 0 :(得分:2)

将所有复选框设置为取消选中作为独立步骤,然后在检查单词时,将匹配设置为选中并跳过不匹配的匹配项。

或者,反转循环并同时检查所有字符串。

private void filterSelection(String[] locations)
{
    foreach (var checkBox in checkBoxArray)
    {
        var willCheck = CheckState.Unchecked;
        foreach (string location in locations)
        {
            if (checkBox.Text.Contains(location))
            {
                willCheck = CheckState.Checked;
                break;
            }
        }
        checkBox.State = willCheck;
    }
}

在这种情况下,避免代码重复的最简单方法是使单字符串版本成为多字符串版本的一种情况。而不是从多字符串版本调用单字符串版本。你可以写:

private void filterSelection(String location)
{
    filterSelection(new [] { location });
}

但是将params关键字添加到数组版本会更容易。

private void filterSelection(params String[] location)

现在您仍然可以显式传递字符串数组。但是您也可以直接传递一个或多个字符串作为参数,编译器将创建该数组。所以这两个都有效:

String[] Others = { "Conference", "Calendar" };
filterSelection(Others);

filterSelection("Conference", "Calendar");