检查复选框

时间:2010-10-29 13:53:57

标签: c#

我正在寻找一种方法来检查用户是否检查了多个方框。

if (checkBox1.Checked == true)
    if (checkBox2.Checked == true)
        MessageBox.Show("Please select one car type");
    else if (checkBox3.Checked == true)
        MessageBox.Show("Please select one car type");

我拥有它的方式的问题是它只显示消息框,如果用户检查第一个复选框,然后他们选择第二个消息框.show出现。但是,如果用户选择了第二个和第三个消息,则该消息不会显示。

我知道我可以按照下面的方式进行,但我认为有更好的方法可以减少代码。因为如果选中复选框2,按照我在消息下方的方式弹出两次会弹出两次。

if (checkBox1.Checked == true)
    if (checkBox2.Checked == true)
        MessageBox.Show("Please select one car type");
    else if (checkBox3.Checked == true)
        MessageBox.Show("Please select one car type");
if (checkBox2.Checked == true)
    if (checkBox1.Checked == true)
        MessageBox.Show("Please select one car type");
    else if (checkBox3.Checked == true)
        MessageBox.Show("Please select one car type");   

2 个答案:

答案 0 :(得分:1)

int totalChecked =   (checkBox1.checked ? 1 : 0) + (checkBox2.checked ? 1 : 0)
                  + (checkBox3.checked ? 1 : 0);

if (totalChecked != 1)
  MessageBox.Show("Please select one car type");

或者作为评论者指出,使用单选按钮(最多允许一个选择)。

答案 1 :(得分:1)

假设这是一个WPF问题

您可以走逻辑树,然后选中所有复选框:

public bool IsAtLeastOneCheckboxChecked(DependencyObject rootObject)
{
    var checkboxes = FindLogicalChildrenOfType<CheckBox>(rootObject);
    foreach (var checkbox in checkboxes)
    {
        if (checkbox.IsChecked == true)
        {
            return true;
        }
    }

    return false;
}

public static IEnumerable<T> FindLogicalChildrenOfType<T>(DependencyObject rootElement) where T : DependencyObject
{
    if (rootElement != null)
    {
        var list = new List<DependencyObject>(LogicalTreeHelper.GetChildren(rootElement).OfType<DependencyObject>());
        foreach (var item in list)
        {
            if (item != null && item is T)
            {
                yield return (T)item;
            }

            foreach (var childOfChild in FindLogicalChildrenOfType<T>(item))
            {
                yield return childOfChild;
            }
        }
    }
}

对于Windows窗体,您可以使用类似的内容来查找所有复选框:

public static IEnumerable<T> FindAllControlsOfType<T>(Control parent) where T : Control
{
    if (parent != null)
    {
        foreach (var control in parent.Controls)
        {
             if (control is T)
             {
                 yield return (T)control;
             }

             foreach (var childOfChild in FindAllControlsOfType<T>(control as Control))
             {
                 yield return childOfChild;
             }
        }
    }
}