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

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

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

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

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

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


person Moulde    schedule 15.05.2009    source источник


Ответы (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();
}
person Aerokneeus    schedule 16.01.2011

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

if(!IsPostBack)
{
  gridView.DataSource = yourDataSource;
  gridView.DataBind();
}
person ichiban    schedule 15.05.2009
comment
Извините, возможно, стоит упомянуть, что spgridview размещается внутри веб-части sharepoint. Поэтому мне нужно создавать элементы управления после каждой обратной передачи. : / - person Moulde; 15.05.2009

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

person Wayne Hartman    schedule 15.05.2009
comment
Я получаю selectedDatakey, и я подключаюсь к другой веб-части, используя этот ключ, и это работает, но это похоже на то, что gridview перекрывает мой выбор своим собственным или чем-то еще. Потому что я запускаю строки и устанавливаю тот, который соответствует выбранному объекту данных, но после обратной передачи он сбрасывает сортировку, и вместо этого строка выбирается по индексу. - person Moulde; 15.05.2009

Посетите блог Johans, чтобы узнать о SPGridView и LinqDataSource.

person salgo60    schedule 22.05.2009

Я сделал несколько сортируемых GridViews, но до сегодняшнего дня, когда я наткнулся на эту проблему, ни одного с взаимодействием команд строки. У меня "простой" 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();
person fortboise    schedule 20.04.2011

У меня все заработало. (как бы)

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

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

Работает нормально, только одна проблема. При сортировке я заставил его переключать направление после нажатия одного и того же столбца более одного раза. Теперь он думает, что я продолжаю нажимать на заголовок столбца, поэтому продолжает отменять сортировку.

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

Спасибо :)

person Moulde    schedule 15.05.2009