Pregunta

Tengo un GridView donde una columna está vinculada a una propiedad de objeto que contiene un entero anulable. Establezco SortExpression en el nombre de la propiedad, y la ordenación funciona perfectamente siempre que todas las filas contengan un valor. Si alguna fila contiene nulo, sin embargo, obtengo una excepción:

System.InvalidOperationException: no se pudieron comparar dos elementos en la matriz. Referencia de objeto no establecida en una instancia de un objeto.

¿Cómo personalizo la lógica de clasificación o comparación para manejar el caso nulo?

¿Fue útil?

Solución

El tipo anulable expone un método de comparación para comparar tipos anulables, por lo que la solución es anular la lógica de clasificación de gridview y especificar manualmente una comparación:

gridview.Sorting += new GridViewSortEventHandler(gridView_Sorting);

protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
{
    // Only add custom handling for the sort expression on the 
    // Nullable<int> column
    if (e.SortExpression == "MySortExpression")
    {
        // Convert datasource to a List<T>
        list.Sort(new Comparison<MyObjectType>(delegate(MyObjectType item1, MyObjectType item2)
        {
            return Nullable.Compare<int>(item1.NullableIntProp, item2.NullableIntProp);
        }));

        // Bind the sorted list back to the gridview
    }
    else
    {
        // delegate to the gridview to handle its own sorting
    }
}

Otros consejos

También puede anular el valor nulo cuando vincula los datos, colocando un 0 en su lugar. Tu respuesta es mucho mejor. :)

También puede crear un tipo personalizado que anule el operador Comparar. Pero eso solo duplicaría (y complicaría) lo que tienes arriba.

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