c# - ASP.NET 中的 Gridview 排序

标签 c# asp.net linq linq-to-sql

我有一个gridview,它的数据源来自linq to 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();

我正在尝试实现gridview的排序功能:

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。我收到此错误:

{"Unable to cast object of type 'System.Collections.Generic.List1[<>f__AnonymousType03[System.String,System.Nullable`1[System.DateTime],System.String]]' to type 'System.Data.DataTable'."}

如何对 gridview 进行排序并纠正错误?谢谢..

最佳答案

您不能使用网格的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();
}

关于c# - ASP.NET 中的 Gridview 排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8700884/

相关文章:

c# - 如何使用 Expression 构建匿名类型?

c# - 如何检查所有列表项是否具有相同的值并返回,如果不相同则返回 “otherValue”?

c# - 无法为媒体类型 'application/x-www-form-urlencoded' 生成示例

javascript - OnKeyUp 事件的十进制检查

linq - 如何在 LINQ 或 SQL 中按日期获取每个 "type"的最后一个元素

c# - 根据另一个元素值选择 XML 元素

c# - 复制列表的二维数组

c# - 如何使用asp.net从远程服务器下载文件

c# - 如何根据索引/行号从DataTable中选择行?

linq - 除非明确要求,否则 Entity Framework 避免检索列