2009-03-05 11 views
12

Mam GridView skonfigurować w następujący sposób:Sortowanie GridView podczas wiązania z danymi kolekcji lub listę obiektów

  • związanego z List<T> w kod z opóźnieniem (używam moje własne niestandardowe BOL)
  • nie DataSource obiektu na stronie HTML
  • sortable na każdej kolumny, która mnie (SortExpression s są ustawione prawidłowo)

jednak otrzymuję następujący komunikat o błędzie:

The GridView 'myGridView' fired event Sorting which wasn't handled.

Jaki jest najlepszy sposób, aby mój List<T> pozwolił na sortowanie?

jestem podejrzewać, że będzie miał do czynienia z określeniem funkcji atrybutu OnSorting, tj .:

OnSorting = "MySortingMethod" 

Odpowiedz

19

Dziękuję za odpowiedzi na temat sortowania. Zwróciłem się do LINQ, aby pomóc w dynamicznym sortowaniu. Ponieważ siatka wie, czy sortować ASC lub DESC i które pole, użyłem wyrażeń LINQ. Wyrażenie wykonało sortowanie, a następnie po prostu powiązałem te wyniki z moim widokiem siatki.

Podejrzewam, że metoda jQuery byłaby szybsza i nie wymagałaby pełnego odświeżenia.

using System.Linq.Expressions; 

public SortDirection GridViewSortDirection 
{ 
    get 
    { 
     if (ViewState["sortDirection"] == null) 
      ViewState["sortDirection"] = SortDirection.Ascending; 

     return (SortDirection)ViewState["sortDirection"]; 
    } 
    set { ViewState["sortDirection"] = value; } 
} 

protected void gridView_Sorting(object sender, GridViewSortEventArgs e) 
{ 
    //re-run the query, use linq to sort the objects based on the arg. 
    //perform a search using the constraints given 
    //you could have this saved in Session, rather than requerying your datastore 
    List<T> myGridResults = PerfomSearch(); 


    if (myGridResults != null) 
    { 
     var param = Expression.Parameter(typeof(T), e.SortExpression); 
     var sortExpression = Expression.Lambda<Func<T, object>>(Expression.Convert(Expression.Property(param, e.SortExpression), typeof(object)), param); 


     if (GridViewSortDirection == SortDirection.Ascending) 
     { 
      myGridView.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression); 
      GridViewSortDirection = SortDirection.Descending; 
     } 
     else 
     { 
      myGridView.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression); 
      GridViewSortDirection = SortDirection.Ascending; 
     }; 


     myGridView.DataBind(); 
    } 
} 
+0

przydatne, thanks .. Ciekawy zobaczyć jak działają metody z jQuery! Merci beaucoup .. – bAN

+4

@ p.campell: nieznacznie zmodyfikowano metodę, ponieważ GridView 'e.SortDirection' zawsze zwraca' SortDirection.Ascending'. mam nadzieję, że nie masz nic przeciwko – naveen

2

poprawny - trzeba będzie obsłużyć onsorting, sortowanie listy i ponownego wiązania.

Można również rozważyć obsługę strony klienta sortującego za pomocą struktury javascript, takiej jak jQuery.

1

można napisać Porównaj dla obiektów:

private int CompareObject(YourObject object1, YourObject object2) 
{ 
    int iReturnValue = 0; 
    if ((object1 != null) && (object2 != null) && 
     (object1.SomeField != object2.SomeField)) 
    { 
     iReturnValue = (object1.SomeField > object2.SomeField) ? 1 : -1; 
    } 
    return iReturnValue; 
} 

Potem, gdy w przypadku sortowania po prostu przekazać w funkcji Porównaj w swoich obiektach rodzaj rutynowych (zakładając, że masz coś takiego jak lista).

// Your list of data from the session or viewstate or whereever you have it stored. 
lstObjects.Sort(CompareObject); 

Masz teraz posortowaną listę, więc po prostu ją przeprowadź ponownie.

1

Prawidłowo, musisz obsługiwać zdarzenie OnSorting i ustawić właściwość AllowSorting na true.

2

Jeśli pojawi się ten błąd:

the datasource does not support server side paging

spróbuj dodać .ToList<T>() do zapytania:

if (e.SortDirection == SortDirection.Ascending) 
{ 
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>(); 
} 
else 
{ 
    GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>(); 
}; 
Powiązane problemy