• 艾伟_转载:扩展方法 之 Asp.Net篇 狼人:


      说起扩展方法,不得不提博客园的鹤冲天,其关于扩展方法的文章基本上占了总文章的一半,其中不乏优秀之作。
      我在Asp.Net开发期间也总结了不少扩展方法,与大家分享一下。

      1. 获取GridView的主键值:

    public static T GetKey<T>(this GridView grid, int rowIndex)
    {
    T key
    = (T)grid.DataKeys[rowIndex].Value;
    return key;
    }

    示例:

    protected void gvMaster_RowEditing(object sender, GridViewEditEventArgs e)
    {
    string key = gvMaster.GetKey<string>(e.NewEditIndex);
    }

      2. 获取GridView的行号:

    public static int GetRowIndex(this GridViewCommandEventArgs e)
    {
    GridViewRow gvrow
    = (GridViewRow)(((Control)e.CommandSource).NamingContainer);
    return gvrow.RowIndex;
    }

    示例:

    protected  void gvMaster_RowCommand(object sender, GridViewCommandEventArgs e)
    {
    int rowIndex = e.GetRowIndex();
    }

      3. 查找指定ID的控件,并转换成指定类型:

    public static T FindControl<T>(this Control control, string id) where T : class
    {
    Control c
    = control.FindControl(id);
    return (c as T);
    }

    示例:

    //从整个页面里查找ID为lblTest的Label
    this.FindControl("lblTest");
    //从Panel里查找ID为lblTest的Label
    Panel1.FindControl("lblTest");

      4. 查找指定类型的控件:

    public static List<T> FindControls<T>(this Control control) where T : Control
    {
    Action
    <Control, List<T>> findhelper =null;
    findhelper
    = (ctl, list) =>
    {
    if (ctl is T)
    {
    list.Add((T)ctl);
    }
    if (ctl.HasControls())
    {
    foreach (Control c in ctl.Controls)
    {
    findhelper(c, list);
    }
    }
    };
    List
    <T> controls =new List<T>();
    findhelper(control, controls);
    return controls;
    }

    示例:

    //从整个页面里查找所有Label
    this.FindControls();
    //从Panel里查找所有Label
    Panel1.FindControls();

    备注:
      在实际开发中有个不错的应用场景——找到所有的RequiredFieldValidator控件并统一设置其错误信息和提示信息:

    var rs = this.FindControls<RequiredFieldValidator>();
    foreach (var r in rs)
    {
    r.ErrorMessage
    = "*";
    r.ToolTip
    = "不能为空";
    }

      当然,如果在FindControls中增加一个Action 参数应该是个不错的方案,这样以上语句就可以直接写成:

     var rs = this.FindControls<RequiredFieldValidator>(r => 
    {
    r.ErrorMessage
    = "*";
    r.ToolTip
    = "不能为空";
    });

      5. 判断本页是是否使用Ajax (其实就是判断是否使用了ScriptManager):

    public static bool IsAjaxPage(this Page page)
    {
    return (ScriptManager.GetCurrent(page) != null);
    }

    public static bool IsAjaxPage(this Control control)
    {
    return (ScriptManager.GetCurrent(control.Page) != null);
    }

    示例:

    if (this.IsAjaxPage())
    {
    do sth about ajax
    }

    6. UpdatePanel 调用javascript 显示信息:

    public static void Alert(this UpdatePanel panel, string message)
    {
    if (message.Length > 50)
    {
    message
    = message.Substring(0, 50);//最多显示50个字符
    }
    //去除javascript不支持的字符
    message = Utility.ReplaceStrToScript(message);
          ScriptManager.RegisterClientScriptBlock(panel, panel.GetType(),
    "Message",
    string.Format( " alert('{0}'); ", message) , true);
    }

    示例:

    udpHeader.Alert("Hello,I'm Bruce!");//注:udpHeader 是UpdatePanel 类型

    把 alert 换成漂亮的提示框就perfect了。

    总结:
      实际项目中远不止这几个扩展方法,只是比较典型就发上来交流交流,其他的稍微有点复杂而且不经常用到。
      有了这些扩展方法,就可以去除项目中很多重复性代码,欢迎大家提出更好的建议。
      末了发觉有点纯代码的味道,但实在这些方法都是入门级,也应该没哪一个是看不懂的,也就不在这里一一罗嗦。

  • 相关阅读:
    poj 1236 Network of Schools 强连通分量 (添加几条边可以使整个图变成强连通图)
    poj 2363 Sightseeing ( 找次短路和最短路的条数 )
    poj 3013
    poj 1679 The Unique MST 最小生成树
    poj 1797 Heavy Transportation (spfa 最短路 )
    hdu 2680 Choose the best route (spfa)
    畅通工程续
    find the longest of the shortest
    SimpleDateFormate的使用
    SimpleDateFormate的使用
  • 原文地址:https://www.cnblogs.com/waw/p/2157115.html
Copyright © 2020-2023  润新知