¿Cómo ordenar gridview por columna que contiene un entero anulable?
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?
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.