2009-05-15 2 views
2

У меня есть GridView (на самом деле SPgridview)Сортировка GridView выбирает другой столбец

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

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

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

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

ответ

2

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

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

Ах, извините, может быть, стоит упомянуть, что spgridview находится внутри веб-части sharepoint. Так что я должен создать элементы управления после каждой обратной передачи. :/ – Moulde

1

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

+0

Я получаю selectedDatakey, и я подключаюсь к другой веб-части с помощью этого ключа, и это работает, но его, как gridview, переопределяет мой выбор с его собственным или чем-то. Потому что я бегаю по строкам и устанавливаю тот, который соответствует выбранному датэки, но после обратной передачи он сбрасывает сортировку, а строка выбирается по индексу. – Moulde

0

У меня это работает. (kinda)

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

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

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

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

Спасибо :)

2

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

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(); 
} 
1

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