网格视图排序 ASP.NET

本文关键字:NET ASP 排序 视图 网格 | 更新日期: 2023-09-27 18:19:18

我有一个网格视图,它的数据源来自linq到sql语句:

var query = from user in dataContext.tbl_files
            select new { user.File_Name, user.Upload_Time, user.Uploaded_By };
GridView1.DataSource = query.ToList();
GridView1.DataBind();

我正在尝试实现网格视图的排序功能:

public void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
    string previousSortExpression = (string)ViewState["SortDirection"];
    string sortExpression = e.SortExpression;
    SortDirection sortDirection = e.SortDirection;
    if (sortExpression.Equals(previousSortExpression))
    {
        sortDirection = SortDirection.Descending;
        ViewState["SortDirection"] = string.Empty;
    }
    else
        ViewState["SortDirection"] = sortExpression;
    string direction = sortDirection == SortDirection.Ascending ? "ASC" : "DESC";
    e.SortExpression = string.Format("it.{0} {1}", e.SortExpression, direction);
    DataTable dataTable = (DataTable)GridView1.DataSource; // here returns null!
    if (dataTable != null)
    {
        DataView dataView = new DataView(dataTable);
        dataView.Sort = e.SortExpression ;
        GridView1.DataSource = dataView;
        GridView1.DataBind();
    }
}

但是" DataTable dataTable = (DataTable)GridView1.DataSource; "行返回 null,但数据源计数为 4。我收到此错误:

{"无法将类型为'System.Collections.Generic.List 1[<>f__AnonymousType0 3[System.String,System.Nullable'1[System.DateTime],System.String]]'的对象转换为类型'System.Data.DataTable'。

如何对网格视图进行排序并纠正错误?谢谢。。

网格视图排序 ASP.NET

不能

使用网格的 DataSource 属性来提取数据源。它仅在设置后和回发结束时可用。您将需要再次从数据库中获取数据。
像这样:

public void GridView1_Sorting(object sender, GridViewSortEventArgs e)
{
  var users = (from user in dataContext.tbl_files
              select new { user.File_Name, user.Upload_Time, user.Uploaded_By }).ToList().AsEnumerable();
  switch(e.SortExpression)
  {
     case "File_Name":
       users = users.OrderBy(x => x.File_Name);
       break;
     case "Upload_Time":
       users = users.OrderBy(x => x.Upload_Time);
       break;
     case "Uploaded_By":
       users = users.OrderBy(x => x.Uploaded_By);
       break;
  }
  if(e.SortDirection == SortDirection.Descending)
    users = users.Reverse();
  GridView1.DataSource = users;
  GridView1.DataBind();
}

上面的答案是正确的,首先您需要在调用排序事件时再次将数据源分配给网格视图。

所以必须将数据存储在某个地方。

要从网格检索数据源,您可以按照以下步骤操作

问题在于您将 linq 结果分配为 gridview 的数据源,然后从网格视图数据源获取数据表。

试试这个代码

BindingSource bs = (BindingSource )Gv.DataSource;
DataTable Dt = (DataTable ) bs.DataSource;

如有任何疑问,请联系