ASP.NET实例:手把手教你如何扩展GridView之自动排序篇_[Asp.Net教程]
					 看到这两天园子里面“****”GridView的兄弟们可真不少,自己也手痒,也凑凑热闹,写得好,大家鼓励鼓励,写的不好,大家多多指教。
 首先说说本文要实现的目的,大家都知道GridView支持排序,但是每次排序的时候,都需要给GridView添加OnSorting事件,这么繁琐而费力,作为世界上最最聪明的程序员的我们难道没有抱怨么?废话少说,不才想到了一种解决这个问题的方法,可以让大家一劳永逸。下面就让兄弟我臭摆一下,希望园子里面的高高手,大大牛们给给面子,捧捧场,别取消兄弟。
 首先创建一个GridViewEx的类,并继承GridView,然后添加如下委托 
public delegate void BindEventHandler();
 在GridViewEx中添加如下代码: 
DataSet _ds;
 [Description("自定义的DataSet类型数据源"),Category("扩展")]
 public virtual DataSet DataSetSource
 {
 get
 {
 return _ds;
 }
 set
 {
 _ds = value;
 }
 }
我们在使用GridViewEx的时候,就只需要设定DataSetSource属性,这个将限定本扩展组件只支持DataSet类型的数据源,其他类型数据源有兴趣的,大家可以进行扩展,象ArrayList,List<>这些都是可以的。
接下来的工作是为GridViewEx添加OnBind事件,如下:
 public event BindEventHandler Bind;
 public virtual void OnBind()
 {
 if (Bind != null)
 {
 Bind();
 if (DataSetSource != null)
 {
 DataView dv = DataSetSource.Tables[0].DefaultView;
 dv.Sort = SortExpressionStr; 
 this.DataSource = dv;
 this.DataBind(); }
 }
 }
有了这个事件,我们就可以让GridView去类外部获取数据源,然后回到类本身来组织数据和进行绑定了。
接下来,需要声明两个方法
 [Description("排序表达式"),Category("扩展")]
 protected virtual string SortExpressionStr
 {
 get
 {
 if (ViewState["SortExpression"] == null)
 {
 return null;
 }
 return ViewState["SortExpression"].ToString();
 }
 set
 {
 ViewState["SortExpression"] = value;
 }
 }
 [Description("排序方向"),Category("扩展")]
 protected virtual string SortDirectionStr
 {
 get
 {
 if (ViewState["SortDirection"] == null)
 {
 return "DESC";
 }
 if (ViewState["SortDirection"].ToString().ToLower() != "asc" && ViewState["SortDirection"].ToString().ToLower() != "desc")
 {
 return "DESC";
 }
 return ViewState["SortDirection"].ToString();
 }
 set
 {
 ViewState["SortDirection"] = value;
 }
 }
和下面的属性
 public string SortExpressionEx
 {
 get
 {
 if (ViewState["SortExpressionEx"] == null)
 {
 return null;
 }
 return ViewState["SortExpressionEx"].ToString();
 }
 set
 {
 ViewState["SortExpressionEx"] = value;
 }
 }
然后重写OnSorting事件如下:
 protected override void OnSorting(GridViewSortEventArgs e)
 {
 SortExpressionEx = e.SortExpression;
 SortExpressionStr = e.SortExpression + " " + SortDirectionStr;
 OnBind();
 if (SortDirectionStr.ToLower() == "asc")
 {
 SortDirectionStr = "DESC";
 }
 else
 {
 SortDirectionStr = "ASC";
 }
 }
并且增加如下的OnLoad事件
 protected override void OnLoad(EventArgs e)
 {
 if (!Page.IsPostBack)
 {
 try
 {
 OnBind();
 }
 catch
 {
 }
 }
 base.OnLoad(e);
 }
经过上面这样简单的改造,您再次使用GridViewEx的时候,在前台页面使用的时候,您只要按照这样的格式就可以了:
 
 <%#Eval(''ID")%> 
 
 后台只需要添加这样的方法
public void BindData()
{
 DataSet ds = new DataSet();
 ds = //获得DataSet;
 gridView1.DataSetSource = ds;
}
 在页面中的Page_Load方法中,也不用再写
if(!Page.IsPostBack)
{
 BindData();//绑定GridView的方法
}
注意,如果需要重新绑定GridView,只需要这样GridViewEx1.OnBind();即可。
来源:jillzhang的blogs