手把手教你如何扩展GridView之自动排序篇

添加人:iyond七级(3513分)   添加时间:2007-06-13    阅读次数:3609  收藏此教程
  首先说说本文要实现的目的,大家都知道GridView支持排序,但是每次排序的时候,都需要给GridView添加OnSorting事件,这么繁琐而费力,作为世界上最最聪明的程序员的我们难道没有抱怨么?废话少说,不才想到了一种解决这个问题的方法,可以让大家一劳永逸。下面就让兄弟我臭摆一下,希望园子里面的高高手,大大牛们给给面子,捧捧场,别取消兄弟。
   首先创建一个GridViewEx的类,并继承GridView,然后添加如下委托
public delegate void BindEventHandler();
在GridViewEx中添加如下代码: 
[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的时候,在前台页面使用的时候,您只要按照这样的格式就可以了:
<cc1:GridViewEx id="gridViewEx1" OnBind="BindData" runat="server" AllowSorting="True">
  <Columns>
    <asp:TemplateField HeaderText="序号" SortExpression="ID"><%#Eval(''ID")%></asp:TemplateField> 
 </Columns>
</cc1:GridViewEx>

后台只需要添加这样的方法
public void BindData()
{
    DataSet ds = new DataSet();
    ds = //获得DataSet;
    gridView1.DataSetSource = ds;
}

在页面中的Page_Load方法中,也不用再写
if (!Page.IsPostBack)
{
    BindData();//绑定GridView的方法
}

注意,如果需要重新绑定GridView,只需要这样GridViewEx1.OnBind();即可。
1页 第1上一页1下一页
相关的教程: GridView 自动排序
收藏此教程

当前平均分: 5.0(1 次打分)

-5-4-3-2-1012345
评论主题
您的大名
您的评论
验证码 点击换一个验证码
知识库搜索: