Сортированный вид сетки выбирает неправильную строку - PullRequest
2 голосов
/ 15 мая 2009

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

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

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

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

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

Ответы [ 6 ]

2 голосов
/ 16 января 2011

Когда вы обрабатываете событие 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();
}
2 голосов
/ 15 мая 2009

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

if(!IsPostBack)
{
  gridView.DataSource = yourDataSource;
  gridView.DataBind();
}
1 голос
/ 20 апреля 2011

Я сделал несколько сортируемых 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 команд строк, которые ВСТАВЛЯЮТ, ОБНОВЛЯЮТ или УДАЛЯЮТ базовые данные, обновляют объект 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();
1 голос
/ 22 мая 2009

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

1 голос
/ 15 мая 2009

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

0 голосов
/ 16 мая 2009

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

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

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

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

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

Спасибо:)

...