zoukankan      html  css  js  c++  java
  • 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!

  • 相关阅读:
    hadoop集群单点配置
    CentOS6.x环境通过yum命令在线安装或重装zookeeper-server
    层层递进——宽度优先搜索(BFS)
    解救小哈——DFS算法举例
    浅谈深度优先搜索
    CodeCombat森林关卡Python代码
    用OpenGL进行曲线、曲面的绘制
    CodeCombat地牢关卡Python代码
    转载:程序员都应该访问的最佳网站
    用OpenGL实现动态的立体时钟
  • 原文地址:https://www.cnblogs.com/lenic/p/2006370.html
Copyright © 2011-2022 走看看