Come ordinare gridview per colonna contenente numero intero nullable?
Domanda
Ho un GridView in cui una colonna è associata a una proprietà dell'oggetto contenente un numero intero nullable. Ho impostato SortExpression sul nome della proprietà e l'ordinamento funziona perfettamente purché tutte le righe contengano un valore. Se qualche riga contiene null, tuttavia, ottengo un'eccezione:
System.InvalidOperationException: impossibile confrontare due elementi nell'array. Riferimento oggetto non impostato su un'istanza di un oggetto.
Come personalizzo la logica di ordinamento o confronto per gestire il caso null?
Soluzione
Il tipo Nullable espone un metodo di confronto per confrontare tipi nullable, quindi la soluzione è quella di sovrascrivere la logica di ordinamento della griglia e specificare manualmente un confronto:
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
}
}
Altri suggerimenti
Potresti anche sovrascrivere il valore null quando leghi i dati, posizionando invece uno 0. La tua risposta è di gran lunga migliore. :)
Puoi anche creare un tipo personalizzato che sovrascrive l'operatore Confronta. Ma questo duplicherebbe (e complicherebbe) ciò che hai sopra.