2008-10-03 7 views
1

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 toutes les lignes contiennent null, cependant, j'obtiens une exception:Comment trier gridview par colonne contenant un nombre entier nul?

System.InvalidOperationException: Impossible de comparer deux éléments dans le tableau. La référence d'objet n'est pas définie à une instance d'un objet. Comment puis-je personnaliser la logique de tri ou de comparaison pour gérer le cas nul?

Répondre

3

Le type Nullable expose une méthode de comparaison pour comparer les types nullables, de sorte que la solution consiste à 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 
    } 
} 
0

On pourrait également remplacer la valeur nulle lors de la liaison des 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 Comparer. Mais cela ne ferait que dupliquer (et compliquer) ce que vous avez ci-dessus.