Сортированный вид сетки выбирает неправильную строку

У меня есть gridview (на самом деле SPgridview)

И я сделал имя столбца кликабельным, чтобы пользователи могли сортировать строки, используя данные. И это прекрасно работает.

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

Как мне это исправить? Я попытался снова отсортировать строку после того, как пользователь выбрал строку, но, похоже, это не работает. И должен ли gridview помнить тот факт, что он был просто отсортирован?

Заранее спасибо:)

6 ответов

Когда вы обрабатываете событие Sorting, установите переменную сеанса, установите ее в направлении сортировки и используйте его при повторном связывании вашего источника данных.

protected void gridview_Sorting()
{
    // BIND DATA Function
    BindData();

    DataTable dt = gridview.DataSource as DataTable;

    if (dt != null)
    {
        //Sort the data.
        dt.DefaultView.Sort = e.SortExpression + " " + GetSortDirection(e.SortExpression);

        Session["sort"] = dt.DefaultView.Sort;
        gridview.DataSource = dt;
        gridview.DataBind();
    }
}





// bind data function//

private void BindData()
{

    DataTable dt = GetDataTable();

    if (Session["sort"] != null)
    {
        //Sort the data.
        dt.DefaultView.Sort = Session["sort"].ToString();
    }

    gridview.DataSource = dt;
    gridview.DataBind();
}

Убедитесь, что вы не привязываете сетку после обратной передачи.

if(!IsPostBack)
{
  gridView.DataSource = yourDataSource;
  gridView.DataBind();
}

Проверьте блог Johans относительно SPGridView и LinqDataSource

Вы захватываете выбранную строку по ее индексу или по уникальному идентификатору данных, которые хотите редактировать? Если вы получаете по индексу строки, это может быть "забыванием", поскольку вы воссоздаете Grid в OnPostBack. Попробуйте перебрать данные и выбрать их по уникальному идентификатору, а не по индексу строки.

Я сделал несколько сортируемых GridView, но ни один из них не взаимодействовал с командами строк до сегодняшнего дня, когда я наткнулся на эту проблему. Мой "простой" GridView, а не SPgridview. Я нашел это работает:

  1. В bindData(), если мы не создали DataTable и не поместили его в объект Session, сделайте это. В противном случае мы будем использовать существующий отсортированный DataTable:
if (Session["dtbl"] == null) {
  Session["dtbl"] = method_to_fetch_datatable();
}
gv.DataSource = Session["dtbl"] as DataTable;
gv.DataBind();
  1. При обработке GridView команд строк, которые INSERT, UPDATE или DELETE базовых данных, обновляют объект Session, поддерживая сортировку, если она есть:
Session["dtbl"] = method_to_fetch_datatable();
if (ViewState["SortExpression"] != null) {
  DataTable dt = Session["dtbl"] as DataTable;
  dt.DefaultView.Sort = ViewState["SortExpression"] as string;
}
bindData();

Я получил это работает. (своего рода)

В событии сортировки я сохранил выражение сортировки (имя столбца, по которому производится сортировка) и направление сортировки по возрастанию или по убыванию.

Затем я делаю источник данных для gridview и databind, и после привязки данных я использую команду gridview.sort для сортировки по значениям, которые я сохранил в viewstate.

Это прекрасно работает, только одна проблема. При сортировке я переключал направление после нажатия на одну и ту же колонку более одного раза. Now it thinks i keep pressing the column title, so it keeps reversing the sorting.

But i tempererarely made it only sort in one direction. And now im playing with the sender object in the sorting event, im thinking that if i could get some info about whats causing the event i could tell it to only switch direction based on the sender.

Спасибо:)

Другие вопросы по тегам