DataGrid应用(三)——排序

DataView 提供了几项用于对 DataTable 中的数据进行排序和筛选的功能:

  • 使用 Sort 属性,可以指定单个或多个列排序顺序并包含 ASC(升序)和 DESC(降序)参数。
  • 可以使用 ApplyDefaultSort 属性自动以升序创建基于表的一个或多个主键列的排序顺序。只有当 Sort 属性为空引用或空字符串时以及表已定义主键时,ApplyDefaultSort 才适用。
  • 使用 RowFilter 属性,可以根据行的列值来指定行的子集。有关 RowFilter 属性的有效表达式的更多信息,请参见有关 DataColumn 类的 Expression 属性的参考信息。
  • 使用 RowStateFilter 属性,可以指定要查看的行版本。DataView 根据基础行的 RowState 来隐式地管理要公开哪些行版本。

所以利用 DataView 的特点,我们可以实现 DataGrid 对列的排序。我实现这样一个DataGrid可以点击各个列头,对不同列进行排序。其原理是: 在客户端触发事件提交到服务端,服务端根据不同的列名对同一个DataTable进行操作生成不同的DataView绑定到 DataGrid, 实现排序的效果。

因为表头是我自定义的div, 所以我需要一个隐藏域来区别客户端提交过来的事件。另外我需要一个隐藏域来获得客户端点击的是哪一列。(保存点击的列名)

在aspx页里有如下两个隐藏域:       

<input id="command" type="hidden" name="command" runat="server">    

<input id="sortCol" type="hidden" name="sortCol" runat="server">                                                       

 表头设计如下:

<table id="caption" cellSpacing="0" cellPadding="0" width="604" border="1"><tr style="BACKGROUND-COLOR: buttonface">

        <td id="tdName" style="CURSOR: hand" onclick="ClickTitle(this)" width="30%" runat="server">Name</td>

        <td id="tdTitle" style="CURSOR: hand" onclick="ClickTitle(this)" width="30%" runat="server">Title</td>   

        <td id="tdTelephone" style="CURSOR: hand" onclick="ClickTitle(this)" width="30%" runat="server">Telepone</td>

</tr></table>

点击表头中各个列头的时候,将触发客户端onclick事件执行客户端脚本ClickTitle()

        function ClickTitle(item)

        {

            item.setAttribute("bgcolor", "#999999", 0);

            document.getElementById("command").value = "sort";

            document.getElementById("sortCol").value = item.innerText;

            document.forms[0].submit();

        }

这个方法,将隐藏域command赋值为sort, 同时将被点击的列名保存在隐藏域sortCol中,提交到服务端。

 服务端在Page_Load()的方法中处理来自客户端的不同请求。

(为了方便操作,代码里把数据源DataTable,DataView定义为类成员变量)

private void Page_Load(object sender, System.EventArgs e)

        {

            if(!this.IsPostBack)

            {

                BindData();

            }

 

            if(this.command.Value == "sort")

            {

                BindData();

                // sortedDataView是对DataTable重新排序后的DataView

                DataView sortedDataView = new DataView(dt, "", this.sortCol.Value.TrimEnd('5'), DataViewRowState.CurrentRows);

                switch(this.sortCol.Value)

                {

                    case "Name":

                        this.tdName.InnerHtml = "Name<span style='FONT-FAMILY: Marlett;'>5</span>";

                        this.tdTitle.InnerHtml = "Title";

                        this.tdTelephone.InnerHtml = "Telephone";

                        break;

                    case "Title":

                        this.tdTitle.InnerHtml = "Title<span style='FONT-FAMILY: Marlett'>5</span>";

                        this.tdName.InnerHtml = "Name";

                        this.tdTelephone.InnerHtml = "Telephone";

                        break;

                    case "Telephone":

                        this.tdTelephone.InnerHtml = "Telephone<span style='FONT-FAMILY: Marlett'>5</span>";

                        this.tdTitle.InnerHtml = "Title";

                        this.tdName.InnerHtml = "Name";

                        break;

                    default:

                        break;

                }

                this._MyDataView = sortedDataView;

                this.DataGrid1.DataSource = sortedDataView;

                this.DataGrid1.DataBind();

                this.command.Value = "";

                this.sortCol.Value = "";

            }

        }

每次在排序的时候,数据都需要重新绑定,即调用BindData()方法。

        private void BindData()

        {

            string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";

            string strDataSource = Server.MapPath(@"../DB/data.mdb");

            strConn = strConn + strDataSource;

            OleDbConnection objConn = null;

            OleDbDataAdapter objDataAdapter = null;

            string strSql = "select Name, Title, Telephone from data";

            try

            {

                objConn = new OleDbConnection(strConn);

                objDataAdapter = new OleDbDataAdapter(strSql, objConn);

                dt = new DataTable();

                objDataAdapter.Fill(dt);

                this._MyDataView = dt.DefaultView;

                this.DataGrid1.DataSource = this._MyDataView;

                this.DataGrid1.DataBind();

            }

            catch(Exception ex)

            {

                this.Response.Write(ex.Message);

            }

        }

注: <span style='FONT-FAMILY: Marlett'>5</span> 是显示在列头里朝上箭头的。所以在调用DataView的构造方法的时候需要去掉多余的这个字符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值