Pregunta

Tengo un GridView configurado de la siguiente manera:

  • vinculado a un List<T> en código subyacente (estoy usando mi propio BOL personalizado)
  • sin objeto DataSource en la página HTML
  • ordenable en cada columna que elijo (los SortExpression s están configurados correctamente)

Sin embargo, recibo el siguiente mensaje de error:

  

El evento activado GridView 'myGridView' Clasificación que no se manejó.

¿Cuál es la mejor manera para que yo obtenga mi OnSorting para permitir la clasificación?

Sospecho que tendrá que ver con especificar una función para el atributo <=>, es decir:

OnSorting = "MySortingMethod"
¿Fue útil?

Solución

Gracias por sus respuestas sobre la clasificación. Me dirigí a LINQ para ayudar a ordenar dinámicamente. Como la cuadrícula sabe si ordenar ASC o DESC, y qué campo, utilicé una expresión LINQ. La expresión realizó la clasificación, y luego simplemente limité esos resultados a mi vista de cuadrícula.

Sospecho que el método jQuery sería más rápido y no requeriría una devolución completa.

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

Otros consejos

Correcto: deberá manejar la clasificación, ordenar su lista y volver a vincular.

Alternativamente, podría considerar manejar el lado del cliente de clasificación utilizando un marco de JavaScript como jQuery.

Si obtiene este error:

  

el origen de datos no admite la paginación del lado del servidor

Intente agregar .ToList<T>() a su consulta:

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

Podría escribir una comparación para sus objetos:

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;
}

Luego, cuando esté en su evento de clasificación, simplemente pase la función Comparar a la rutina de clasificación de objetos (suponiendo que tenga algo como Lista).

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

Ahora tiene una lista ordenada, así que simplemente vuelva a vincularla.

Correcto, debe controlar el evento OnSorting y establecer la propiedad AllowSorting en true.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top