你如何从asp.net代码中获得一个复选框列表?

时间:2009-10-07 18:57:32

标签: c# asp.net checkbox

我确定这是一个简单的问题,但我想不出一种方法(除了使用javascript强制回发之外)获取后面的asp.net代码中的复选框列表。

每个复选框都在一个单独的自定义控件中,因此我无法使用复选框列表。

任何帮助都会非常感激。

提前致谢

2 个答案:

答案 0 :(得分:1)

如果你有一个包含N个复选框的usercontrol,你需要公开一个包含id,控件集合的公共属性......无论你需要从父容器访问它的是什么。

答案 1 :(得分:0)

您可以递归遍历页面上控件的层次结构,只需获取CheckBoxes的控件

在您的页面中,您可以声明一个用于存储复选框的成员:

private List<CheckBox> checkBoxes = new List<CheckBox>();

使用递归方法可以遍历控件结构:

public void TraverseHierarchy(ControlCollection controls)
{
    foreach (Control c in controls)
    {
        CheckBox checkBox = c as CheckBox;
        if (checkBox != null)
        {
            checkBoxes.Add(checkBox);
        }
        if (c.Controls.Count > 0)
        {
            TraverseHierarchy(c.Controls);
        }
    }
}

您可以通过提供Page:

的控件集合来调用它
TraverseHierarchy(Page.Controls);

但是上面代码的一个问题是某些控件继承自CheckBox控件。就像RadioButton一样。因此,as有效,因此控件也会在您的收藏中匹配。

您可以做的是根据复选框的特定属性进行进一步过滤。例如,如果您的ID命名在您的复选框中保持一致,您还可以检查ID属性是否以特定前缀开头:

public void TraverseHierarchy(ControlCollection controls)
{
    foreach (Control c in controls)
    {
        CheckBox checkBox = c as CheckBox;
        if (checkBox != null)
        {
            if (checkBox.ID.StartsWith("cb"))
            {
                checkBoxes.Add(checkBox);
            }
        }
        if (c.Controls.Count > 0)
        {
            TraverseHierarchy(c.Controls);
        }
    }
}

或者你可以通过使用is运算符来消除扩展CheckBox的控件,但这会对性能产生额外的影响并且是一个非常难看的解决方案。