对ASP.net服务器控件进行分组以修改属性,而无需按名称引用它们

时间:2011-10-20 14:29:42

标签: c# asp.net servercontrols

我正在尝试从我的代码隐藏中为aspx页面动态设置多个框,面板,按钮等的Visible属性。我想知道是否有办法将服务器控件分组到某个逻辑组,以便您可以执行类似这样的伪代码:

foreach(c in controlgroup) {
    c.Visible = value
}

原因是页面显示不同类型的选项,具体取决于URL中的ID参数。我看过this question但是我想知道是否有另一种方法可以做到这一点而不是使用用户控件?

修改: 如果我可以在aspx页面上设置组而不是必须手动添加每个控件,那将是很好的。

3 个答案:

答案 0 :(得分:2)

不确定。您可以通过构建List<Control>对它们进行分组,然后循环它。

var controlList = new List<Control>();
controls.Add(someTextBox);
controls.Add(someOtherTextBox);
// etc.

// elsewhere
foreach (var control in controlList)
    control.Visible = false;

当然,如果您正在处理所有保存在公共容器(窗体,面板等)中的控件,您可以简单地遍历其控件集合。

foreach (var control in theContainer.Controls)
    control.Visible = false;

在这个简单的例子中,使容器本身不可见将完成这项工作。除了这些简单的方法之外,没有办法对我知道的控件进行分组,但是我并不常常处理UI。

答案 1 :(得分:2)

如果你把它们放在某种容器中,比如Panel或PlaceHolder,你可以这样做:

List<WebControl> ctrlList = PlaceHolder1.Controls.Cast<WebControl>().ToList();
foreach (WebControl ctrl in ctrlList)
{
    ctrl.Visible = false;
}

您可以通过以下方式缩短上述示例:

PlaceHolder1.Controls.Cast<WebControl>().ToList().ForEach(x => x.Visible = false);

如果您愿意,可以创建返回不同类型控件列表的属性:

public List<TextBox> InputList
{
    get
    {
        return PlaceHolder1.Controls.OfType<TextBox>().ToList();
    }
}

答案 2 :(得分:0)

有多种方法可以执行此操作,具体取决于您指定的项目/需求。

您可以在<asp:Panel>中包装一组项目,然后使用Children集合。

您可以为控件指定特殊ID,例如group1_name,group2_name等,并循环页面的子控件集合

您可以为控件添加属性,例如<asp:Button ... myGroup="1" />,然后循环页面的子控件,然后检查属性。

您可以添加基类并监视子集合,并使用.Tag属性来分配组

等等...