WebForm —— 快速寻找控件

自从上次写完 Enum 的扩展之后,很久没有动手写东西了。因为开发的是 Web 方面的东西,所以在编写前台时,权限、状态等都需要在基类页面编写代码。等到页面呈现的时候,根据控件的 ID 去控制控件的各种属性。此时就出现问题了,如果这些控件不在一个层次内,我该如何找到这些控件?

 

我们知道,在 Asp.Net 控件中有一个 FindControl 方法,用于查找直接属于该控件的子控件;也有一个 Controls 集合属性,其中包含了所有直接属于该控件的子控件。

 

当初这只是一个想法,在基类页面编写权限、状态控制代码,使用反射或者其它条件控制控件的各种属性,因为这样可以把代码减少到最少。毕竟绝大多数控制是可见性,配合微软提供给我们的 Linq To Object ,可以很方便的解决问题。

 

为此,我以扩展方法为基础,写了一个专门查找控件所有子控件的扩展,希望帮到那些遇到和我相同问题的你:

/// <summary>
/// 获得当前的命名容器及其子容器包含的所有控件列表.
/// </summary>
/// <param name="control">当前的命名容器的标识符. </param>
/// <returns>当前的命名容器及其子容器包含的所有控件列表.</returns>
public static IEnumerable<Control> ControlsEx(this Control control)
{
    if (control.HasControls())
    {
        foreach (Control item in control.Controls)
        {
            if (item.HasControls())
                foreach (var inner in ControlsEx(item))
                    yield return inner;
 
            yield return item;
        }
    }
}

 

下面我说一下和 Linq 的配合:我的做法是写了一些重载,均是以上面的这个 ControlsEx 方法为核心。下面直接用代码说话:

/// <summary>
/// 在当前的命名容器及其子容器中搜索带指定 id 参数的服务器控件.
/// </summary>
/// <typeparam name="T">待查询的控件类型.</typeparam>
/// <param name="control">当前的命名容器的标识符.</param>
/// <param name="id">要查找的控件的标识符.</param>
/// <returns>指定的控件, 或为 <c>null</c>(如果指定的控件不存在的话).</returns>
public static T FindControlEx<T>(this Control control, string id) where T : Control
{
    return FindControlEx(control, id) as T;
}
 
/// <summary>
/// 在当前的命名容器及其子容器中搜索带指定 id 参数的服务器控件. 
/// </summary>
/// <param name="control">当前的命名容器的标识符. </param>
/// <param name="id">要查找的控件的标识符. </param>
/// <returns>指定的控件, 或为 <c>null</c>(如果指定的控件不存在的话).</returns>
public static Control FindControlEx(this Control control, string id)
{
    return ControlsEx(control).FirstOrDefault(p => p.ID == id);
}
 
/// <summary>
/// 在当前的命名容器中搜索带指定 id 参数的服务器控件.
/// </summary>
/// <typeparam name="T">待查询的控件类型.</typeparam>
/// <param name="control">当前的命名容器的标识符.</param>
/// <param name="id">要查找的控件的标识符.</param>
/// <returns>指定的控件, 或为 <c>null</c>(如果指定的控件不存在的话).</returns>
public static T FindControl<T>(this Control control, string id) where T : Control
{
    return control.FindControl(id) as T;
}

 

我的做法到此讲完了。有了这个开始,聪明的你是不是有了很多想法呢?Do It!

posted @ 2011-04-06 09:37  Lenic  阅读(3016)  评论(5编辑  收藏  举报