Ordinamento di una visualizzazione griglia durante l'associazione di dati a una raccolta o un elenco di oggetti

StackOverflow https://stackoverflow.com/questions/617088

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"
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top