【问题标题】:Gridview sorting in ASP.NETASP.NET 中的 Gridview 排序
【发布时间】:2012-01-02 12:32:55
【问题描述】:

我有一个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。我收到了这个错误:

{“无法将'System.Collections.Generic.List1[<>f__AnonymousType03[System.String,System.Nullable`1[System.DateTime],System.String]]'类型的对象转换为'System.数据.DataTable'。"}

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

【问题讨论】:

  • 为什么你不使用 linq2sql 数据源,这样你的排序工作开箱即用?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    试试这个代码

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

    如有疑问请联系

    【讨论】:

    • BindingSource 无法识别。我们应该添加任何命名空间吗?
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2016-07-31
    • 2011-01-21
    • 1970-01-01
    • 2017-03-28
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多