C# 页面上的计数控件

C# 页面上的计数控件,c#,asp.net,C#,Asp.net,我的问题是,我想数一数页面上的控件,然后获取它们的类型,如果有文本框、复选框或组合框,那么让它们启用或禁用?网上有什么例子吗 谢谢这将是一个昂贵的操作,因为您必须递归地遍历页面的控件集合来检查每个控件。也许您不知道ASP.NET将Disabled属性从父级级联到子级?换句话说,如果将父控件设置为禁用,则所有子输入控件也将禁用 编辑:如果你真的想这样做,那么这是最好的方法: protected override void OnPreRender(EventArgs e) { base.On

我的问题是,我想数一数页面上的控件,然后获取它们的类型,如果有文本框、复选框或组合框,那么让它们启用或禁用?网上有什么例子吗


谢谢

这将是一个昂贵的操作,因为您必须递归地遍历页面的控件集合来检查每个控件。也许您不知道ASP.NET将
Disabled
属性从父级级联到子级?换句话说,如果将父控件设置为禁用,则所有子输入控件也将禁用

编辑:如果你真的想这样做,那么这是最好的方法:

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);

    int count = 0;

    this.disableControls(this, ref count);
}

void disableControls(Control control, ref int count)
{
    foreach (Control c in control.Controls)
    {
        WebControl wc = c as WebControl;

        if (wc != null)
        {
            count++;
            wc.Enabled = false;             
        }

        this.disableControls(c, ref count);
    }
}

这将是一个昂贵的操作,因为您必须递归地遍历页面的控件集合来检查每个控件。也许您不知道ASP.NET将
Disabled
属性从父级级联到子级?换句话说,如果将父控件设置为禁用,则所有子输入控件也将禁用

编辑:如果你真的想这样做,那么这是最好的方法:

protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender(e);

    int count = 0;

    this.disableControls(this, ref count);
}

void disableControls(Control control, ref int count)
{
    foreach (Control c in control.Controls)
    {
        WebControl wc = c as WebControl;

        if (wc != null)
        {
            count++;
            wc.Enabled = false;             
        }

        this.disableControls(c, ref count);
    }
}

您可以使用以下方法:

public int CountControls(Control top)
{
    int cnt = 1;
    foreach (Control c in top.Controls)
        cnt += CountControls(c);
    return cnt;
}

但正如安德鲁所说,这会很昂贵。

您可以使用以下方法:

public int CountControls(Control top)
{
    int cnt = 1;
    foreach (Control c in top.Controls)
        cnt += CountControls(c);
    return cnt;
}
private void ChangeControlStatus(ControlCollection col, bool status)
 {
    foreach (Control ctrl in col)
        ChangeControlStatus(ctrl.Controls, status)

          if (ctrl is TextBox)

            ((TextBox)ctrl).Enabled = status;

          else if (ctrl is Button)

            ((Button)ctrl).Enabled = status;

          else if (ctrl is RadioButton)

            ((RadioButton)ctrl).Enabled = status;

          else if (ctrl is ImageButton)

            ((ImageButton)ctrl).Enabled = status;

          else if (ctrl is CheckBox)

            ((CheckBox)ctrl).Enabled = status;

          else if (ctrl is DropDownList)

            ((DropDownList)ctrl).Enabled = status; 

       else if (ctrl is HyperLink)

        ((HyperLink)ctrl).Enabled = status; 

 }

但正如Andrew所说,这会很昂贵。

控件上有Enabled属性,您不需要对每个属性进行装箱。。。您可以将所需的类型放入数组中,然后改为检查类型。可能会稍微慢一点,但更易于维护(如果您需要更改其操作的控件类型)。问题中的要求是“获取其类型”,我同意启用时不需要它,但可能需要对特定类型采取其他操作。控件上有Enabled属性,你不需要对每一个都进行分类。。。您可以将所需的类型放入数组中,然后改为检查类型。可能会稍微慢一点,但更易于维护(如果您需要更改其操作的控件类型)。问题中的要求是“获取其类型”,我同意启用时不需要它,但可能需要对特定类型采取其他操作。
private void ChangeControlStatus(ControlCollection col, bool status)
 {
    foreach (Control ctrl in col)
        ChangeControlStatus(ctrl.Controls, status)

          if (ctrl is TextBox)

            ((TextBox)ctrl).Enabled = status;

          else if (ctrl is Button)

            ((Button)ctrl).Enabled = status;

          else if (ctrl is RadioButton)

            ((RadioButton)ctrl).Enabled = status;

          else if (ctrl is ImageButton)

            ((ImageButton)ctrl).Enabled = status;

          else if (ctrl is CheckBox)

            ((CheckBox)ctrl).Enabled = status;

          else if (ctrl is DropDownList)

            ((DropDownList)ctrl).Enabled = status; 

       else if (ctrl is HyperLink)

        ((HyperLink)ctrl).Enabled = status; 

 }