【问题标题】:How to make asp:GridView sortable?如何使 asp:GridView 可排序?
【发布时间】:2012-06-14 19:05:34
【问题描述】:

我有一个asp:GridView 控件,我已将AllowSorting="True" 属性设置为:

<asp:GridView ID="gridUsers" runat="server" PageSize="100" ShowHeaderWhenEmpty="True"
   Width="100%" AllowSorting="True" onrowcreated="gridUsers_RowCreated" 
   onsorting="gridUsers_Sorting">
</asp:GridView>

在设计时,网格看起来是可排序的:

但在运行时只有中间列是可排序的:

如何在 ASP.NET 中使asp:GridView 可排序?


注意asp:GridViewAllowSorting 需要存在一个 Sorting 事件处理程序:

protected void gridUsers_Sorting(object sender, GridViewSortEventArgs e)
{
   //asp:GridView will throw an exception if a Sorting event handler isn't present
}

更新:我意识到描述栏的特别之处。它是数据库中唯一显示名称正确的列原样。其余列i have to fix the display name to be presentable

protected void gridUsers_RowCreated(object sender, GridViewRowEventArgs e)
{
   e.Row.Cells[0].Visible = false; //UserGUID
   e.Row.Cells[1].Text = "User name";
   e.Row.Cells[2].Text = "Full name";
   //3=Description
   e.Row.Cells[4].Text = "E-mail";
   e.Row.Cells[5].Text = "Active";
       e.Row.Cells[5].Visible = false;
   e.Row.Cells[6].Text = "Account type";
 }

现在我只需要找出棘手的部分;并使列可排序。

【问题讨论】:

    标签: asp.net sorting webforms


    【解决方案1】:
    protected void gridUsers_Sorting(object sender, GridViewSortEventArgs e)
    {
        DataTable dt = Session["SortedTable"] as DataTable;
    
        if (dt != null)
        {
    
          //Sort the data.
          dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);
          gridUsers.DataSource = Session["SortTable"];
          gridUsers.DataBind();
        }
    }
    

    改编自msdn example

    【讨论】:

      【解决方案2】:

      这段代码肯定会对你有所帮助:

      在 GridView 中,使属性 AllowSorting = "True" 并在 GridView Columns 中像这样给出

      <asp:BoundField DataField="UserName" HeaderText="User Name" SortExpression="UserName" />
      <asp:BoundField DataField="FullName" HeaderText="Full Name" SortExpression="FullName" />
      

      并使用以下编码:

      protected void gv_Sorting(object sender, GridViewSortEventArgs e)
      {
          try
          {
              string sortExpression = e.SortExpression;
              ViewState["z_sortexpresion"] = e.SortExpression;
              if (GridViewSortDirection == SortDirection.Ascending)
              {
                  GridViewSortDirection = SortDirection.Descending;
                  SortGridView(sortExpression, "DESC");
              }
              else
              {
                  GridViewSortDirection = SortDirection.Ascending;
                  SortGridView(sortExpression, "ASC");
              }
          }
          catch (Exception ex)
          {
              return ex.Message.ToString();
          }
      }
      public SortDirection GridViewSortDirection
      {
          get
          {
              if (ViewState["sortDirection"] == null)
                  ViewState["sortDirection"] = SortDirection.Ascending;
              return (SortDirection)ViewState["sortDirection"];
          }
          set
          {
              ViewState["sortDirection"] = value;
          }
      
      }
      private void SortGridView(string sortExpression, string direction)
      {
          DTSorting = new DataView(DTSorting, "", sortExpression + " " + direction, DataViewRowState.CurrentRows).ToTable();
          gv.DataSource = DTSorting;
          gv.DataBind();
      }
      public DataTable DTSorting
      {
          get
          {
              if (ViewState["Sorting"] != null)
              {
                  return (DataTable)ViewState["Sorting"];
              }
              else
                  return null;
          }
          set
          {
              ViewState["Sorting"] = value;
          }
      }
      

      在这里,考虑“DTSorting”是您绑定 GridView“gv”的 DataTable。

      【讨论】:

      • 我不得不重新设计一切以使用“早期”绑定,而不是“晚期”绑定(因此在答案中使用asp:BoundField)。如果在运行时绑定 GridView 会阻塞。
      猜你喜欢
      • 2015-02-02
      • 2014-01-12
      • 1970-01-01
      • 2010-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多