Ordinamento di una visualizzazione griglia durante l'associazione di dati a una raccolta o un elenco di oggetti
-
03-07-2019 - |
Domanda
Ho un GridView impostato nel modo seguente:
- associato a un
List<T>
in code-behind (sto usando il mio BOL personalizzato) - nessun oggetto DataSource nella pagina HTML
- ordinabile su ogni colonna che scelgo (i
SortExpression
sono tutti impostati correttamente)
Tuttavia, sto ricevendo il seguente messaggio di errore:
L'ordinamento degli eventi 'myGridView' di GridView non è stato gestito.
Qual è il modo migliore per ottenere il mio OnSorting
per consentire l'ordinamento?
Sospetto che avrà a che fare con la specifica di una funzione per l'attributo <=>, ovvero:
OnSorting = "MySortingMethod"
Soluzione
Grazie per le risposte sull'ordinamento. Mi sono rivolto a LINQ per aiutare a ordinare in modo dinamico. Poiché la griglia sa se ordinare ASC o DESC e quale campo, ho usato un'espressione LINQ. L'espressione ha eseguito l'ordinamento, quindi ho semplicemente associato tali risultati alla mia visualizzazione griglia.
Sospetto che il metodo jQuery sarebbe più veloce e non richiederebbe un postback completo.
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();
}
}
Altri suggerimenti
Corretto: dovrai gestire l'ordinamento, ordinare l'elenco e ricollegare.
In alternativa puoi guardare a gestire il lato client di ordinamento usando un framework javascript come jQuery.
Se viene visualizzato questo errore:
l'origine dati non supporta il paging lato server
Prova ad aggiungere .ToList<T>()
alla tua query:
if (e.SortDirection == SortDirection.Ascending)
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderBy(sortExpression).ToList<T>();
}
else
{
GridViewTrackerLoans.DataSource = myGridResults.AsQueryable<T>().OrderByDescending(sortExpression).ToList<T>();
};
Puoi scrivere un confronto per i tuoi oggetti:
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;
}
Quindi, quando nel tuo evento di ordinamento, passa la funzione Confronta nella routine di ordinamento degli oggetti (supponendo che tu abbia qualcosa come Elenco).
// Your list of data from the session or viewstate or whereever you have it stored.
lstObjects.Sort(CompareObject);
Ora hai un elenco ordinato, quindi basta ricollegarlo.
Corretto, è necessario gestire l'evento OnSorting e impostare la proprietà AllowSorting su true.