Сортированный вид сетки выбирает неправильную строку
У меня есть 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. Я нашел это работает:
- В bindData(), если мы не создали DataTable и не поместили его в объект Session, сделайте это. В противном случае мы будем использовать существующий отсортированный DataTable:
if (Session["dtbl"] == null) { Session["dtbl"] = method_to_fetch_datatable(); } gv.DataSource = Session["dtbl"] as DataTable; gv.DataBind();
- При обработке 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.
Спасибо:)