Question

J'ai un GridView où une colonne est liée à une propriété d'objet contenant un entier nullable. J'ai défini SortExpression sur le nom de la propriété et le tri fonctionne parfaitement tant que toutes les lignes contiennent une valeur. Si des lignes contiennent null, cependant, j'obtiens une exception:

System.InvalidOperationException: Echec de la comparaison de deux éléments du tableau. La référence d'objet n'est pas définie sur une instance d'objet.

Comment personnaliser la logique de tri ou de comparaison pour gérer le cas nul?

Était-ce utile?

La solution

Le type Nullable expose une méthode de comparaison pour comparer les types Nullable. La solution consiste donc à remplacer la logique de tri gridview et à spécifier manuellement une comparaison:

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

Autres conseils

Vous pouvez également remplacer le null lorsque vous liez les données, en plaçant un 0 à la place. Votre réponse est bien meilleure. :)

Vous pouvez également créer un type personnalisé qui remplace l'opérateur de comparaison. Mais cela ne ferait que dupliquer (et compliquer) ce que vous avez ci-dessus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top