实现控件DataGrid的双向排序

DataGrid服务器控件提供一种向网格中添加排序功能的途径,可以使用下列方法进行排序
(1) 默认排序:网格中的所有列都是可以排序的,每列的标头包含一个LinkButton控件,用户单击譔控件可以进行排序。若要使用默认排序,请设置DataGrid控件的属性以启用所有列的排序,然后在SortCommand事件中创建处理的程序执行譔排序,设置默认排序可以按如下方法:
 1:在"设计"视图中,选择DataGrid控件,然后单击"属性"窗口底部的"属性生成器"链接。
 2:在"DataGrid 属性"对话框中,单击"常规"选项卡。
 3:将网格的AllowSorting属性设置为True.
 4:运行时,所有的列的标头自动呈现为LinkButton控件。当用户单击列标头时,该列的绑定字段的名称作为排序的关键字传递。
(2) 自定义排序:定义可将哪些列排序以及用户单击该列标头中什么类型的按钮进行排序。
自定义排序是在网格中定义绑定列和模板列,并在SortCommand事件中编写代码以排序数据。设置自定义排可按照如下步骤进行:
 1:在"设计"视图中,选择控件,然后单击"属性"窗口底部的"属性生成器"链接。
 2:在"DataGrid 属性"对话框中,单击"常规"选项卡。
 3:在"行为"部分,选择"允许排序"框,然后切换到"列"选项卡。
 4:向控件中添加绑定列和模板列的任意组合。
 5:若要启用列的排序,请为譔列的"排序表达式"输入值。通常是譔列要绑定到的数据字段名称。

页面代码:

<form id="Form1" method="post" runat="server">
   <h2>在DataGrid中实现双向排序</h2>
   <asp:datagrid id="dgPagerState" style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 64px"
    runat="server" BorderColor="#E7E7FF" BorderStyle="None" BorderWidth="1px" BackColor="White"
    CellPadding="3" GridLines="Horizontal" PageSize="5" Height="20px" AutoGenerateColumns="False"
    Width="376px" AllowSorting="True" AllowPaging="True">
    <SelectedItemStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#738A9C"></SelectedItemStyle>
    <AlternatingItemStyle BackColor="#F7F7F7"></AlternatingItemStyle>
    <ItemStyle ForeColor="#4A3C8C" BackColor="#E7E7FF"></ItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="#F7F7F7" BackColor="#4A3C8C"></HeaderStyle>
    <FooterStyle ForeColor="#4A3C8C" BackColor="#B5C7DE"></FooterStyle>
    <Columns>
     <asp:BoundColumn DataField="LastName" SortExpression="LastName" HeaderText="LastName"></asp:BoundColumn>
     <asp:BoundColumn DataField="FirstName" SortExpression="FirstName" HeaderText="FirstName"></asp:BoundColumn>
     <asp:BoundColumn DataField="City" SortExpression="City" HeaderText="City"></asp:BoundColumn>
     <asp:BoundColumn DataField="BirthDate" SortExpression="BirthDate" HeaderText="BirthDate" DataFormatString="{0:D}"></asp:BoundColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Right" ForeColor="#4A3C8C" BackColor="#E7E7FF" Mode="NumericPages"></PagerStyle>
   </asp:datagrid>
  </form>

后台代码:

页面载入事件

private void Page_Load(object sender, System.EventArgs e)
  {
   if(!IsPostBack)
   {
    //设置排序表达式
    ViewState["SortOrder"] = "LastName";
    //设置排序的升降序
    ViewState["OrderDire"] = "ASC";
    //数据绑定
    DataGridDataBind();
   }
  }

数据绑定方法

private void DataGridDataBind()
  {
   //定义数据连接对象,其中数据库连接字符串是在Web.Config文件中定义的
   SqlConnection conn = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionSqlServer"].ToString());
   //创建数据适配器对象
   SqlDataAdapter da = new SqlDataAdapter("select LastName,FirstName,Title,TitleOfCourtesy,BirthDate,City from Employees",conn);
   //创建DataSet对象
   DataSet ds = new DataSet();
   try
   {
    //填充数据集
    da.Fill(ds,"testTable");
    //取得填充表格的默认视图
    DataView view = ds.Tables["testTable"].DefaultView;
    //设置排序关键字
    string sort = (string)ViewState["SortOrder"] + " " + (string)ViewState["OrderDire"];
    //设置排序表达式
    view.Sort =  sort;
    //数据邦定
    dgPagerState.DataSource = view;
    dgPagerState.DataBind();
   }
   catch(Exception error)
   {
    Response.Write(error.ToString());
   } 
  }


 DataGrid控件的分页事件

private void dgPagerState_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
  {
   //设置DataGrid的当前显示页的索引值为选择的页面索引值
   dgPagerState.CurrentPageIndex = e.NewPageIndex;
   DataGridDataBind();
  }

DataGrid的排序事件

  private void dgPagerState_SortCommand(object source, System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
  {
   //取得排序表达式
   string vortExp = e.SortExpression;
   //如果是当前排序表达式
   if(ViewState["SortOrder"].ToString() == vortExp)
   {
    //如果原来是降序则改为升序,反之亦然
    if((string)ViewState["OrderDire"] == "Desc")
     ViewState["OrderDire"] = "ASC";
    else
     ViewState["OrderDire"] = "Desc";
   }
   else
   {
    //重新设置排序关键字
    ViewState["SortOrder"] = e.SortExpression;
   }
   DataGridDataBind();
  }

运行点击DataGrid的列标头就可以进行排序了。

原文地址:https://www.cnblogs.com/conquer/p/553330.html