Сортировка Gridview в ASP.NET - PullRequest
2 голосов
/ 02 января 2012

У меня есть 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; "строка возвращает ноль, однако количество источника данных равно 4. Я получил эту ошибку:

{"Невозможно привести объект типа 'System.Collections.Generic.List 1[<>f__AnonymousType0 3 [System.String, System.Nullable`1 [System.DateTime], System.String]] 'для ввода' System.Data.DataTable '. "}

Как мне отсортировать сетку и исправить ошибку?Спасибо ..

Ответы [ 2 ]

2 голосов
/ 02 января 2012

Вы не можете использовать свойство 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();
}
1 голос
/ 02 января 2012

Вышеуказанный ответ верен, во-первых, вам нужно снова назначить источник данных для gridview, когда вызывается событие сортировки.

Поэтому необходимо хранить данные где-то.

Для получения источника данных из сетки вы можетевыполните следующие шаги

Проблема заключается в том, что вы присваиваете результат linq как источник данных gridview, а затем берете данные из источника данных gridview.

Попробуйте этот код

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

Контактесли у вас есть какие-либо сомнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...