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?

È stato utile?

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.

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