2010-02-19 6 views
1

Je suis en train de mettre à jour un site ASP .NET existant. Ce site a une classe de contrôle de grille personnalisée qui étend le contrôle GridView pour ajouter quelques fonctionnalités. De nombreuses pages du site utilisent la fonction de liaison bidirectionnelle déclarative intégrée à la base GridView, c'est-à-dire que les modèles de colonne appellent Bind() afin que les données puissent être affichées et mises à jour automatiquement. Cela fonctionne bien dans la plupart des cas. Cependant, lors de la liaison des contrôles DropDownList, il y a maintenant un problème. Récemment, j'ai dû ajouter une fonctionnalité qui permet aux enregistrements de certaines tables d'être marqués comme 'Fermés', c'est-à-dire qu'ils ne peuvent plus être référencés par de nouveaux enregistrements insérés dans d'autres tables. Lors de la modification d'une ligne de la grille de données contenant une liste déroulante d'enregistrements enfants pouvant être fermés, la propriété SelectedValue peut être liée à un ID qui n'existe pas dans la liste. Cela provoque une exception ArgumentOutOfRange à être levée. Je veux juste que DropDownList par défaut à aucune sélection si l'enregistrement est fermé et donc pas dans la liste.Problème avec GridView, Bind() et DropDownList

Je suis à la recherche de la façon la plus simple de résoudre ce problème. Si possible, je ne veux pas avoir à apporter beaucoup de modifications au code existant.

Je peux définir par programme l'index sélectionné de DropDownList dans l'événement RowDataBound. Mais je ne peux pas trouver un moyen de mettre à jour la valeur tout en conservant la fonctionnalité de mise à jour existante.

La question réelle:

Est-il possible d'étendre le DropDownList pour en faire ignorer les valeurs non valides pour la propriété SelectedValue? Le seul exemple que j'ai vu jusqu'ici ne fonctionne pas. Je pense que DropDownList met en cache la valeur dans le cas où sa propriété DataSource n'a pas encore été définie, donc la substitution de la propriété SelectedValue n'est pas suffisante.

Alternativement, s'il existe un moyen d'utiliser l'événement OnRowUpdating pour ajouter manuellement les données à la mise à jour, alors ce serait OK. J'ai essayé d'ajouter des valeurs au dictionnaire NewValues ​​dans la classe GridViewUpdateEventArgs, mais cela ne semble pas fonctionner. Notez que les grilles sont liées à des listes d'objets et non aux contrôles dérivés de DataSourceControl.

Toute aide serait appréciée. Merci.

Répondre

2

Si quelqu'un est intéressé, je pense que j'ai résolu cela en remplaçant la méthode PerformDataBinding et en attrapant l'argument ArgumentOutOfRangeException. Je soupçonne que la propriété SelectedValue peut également être remplacée si l'ordre dans lequel les deux propriétés sont liées peut varier.