除了将所有控件分组到一个容器控件中之外,没有简单的方法可以在 ASP.NET 服务器端代码中找到给定某些属性的一组控件。
在客户端,您可以使用 jQuery 之类的东西来查找这些元素并隐藏它们:
$(".instructions").hide();
当页面完全加载时,我可能会这样做:
$(document).ready(function() {
$(".instructions").hide();
});
在 Javascript 中隐藏元素的一个缺点是,如果有足够的数据,它可能需要一秒钟的时间并导致内容闪烁。另一个区别是隐藏内容客户端不会从 DOM 中删除它 - 内容只是隐藏在那里。在服务器端隐藏控件可防止其内容甚至被发送到 HTML。
在 C# 中做同样的事情有点困难——它需要递归地遍历控制树并在 Control 集合中寻找匹配的元素。这是一个足够常见的操作,实用函数很有用。 C# iterator syntax(收益回报)有助于清理:
// utility method to recursively find controls matching a predicate
IEnumerable<Control> FindRecursive( Control c, Func<Control,bool> predicate )
{
if( predicate( c ) )
yield return c;
foreach( var child in c.Controls )
{
if( predicate( c ) )
yield return c;
}
foreach( var child in c.Controls )
foreach( var match in FindRecursive( c, predicate ) )
yield return match;
}
// use the utility method to find matching controls...
FindRecursive( Page, c => (c is WebControl) &&
((WebControl)c).CssClass == "instructions" );
现在隐藏控件相对容易:
foreach( WebControl c in FindRecursive( Page, c => (c is WebControl) &&
((WebControl)c).CssClass == "instructions" ) )
{
c.Visible = false;
}