2009-08-27 6 views
1

Je cherche des informations sur la façon de mettre en œuvre un conteneur de nommage personnalisé pour les éléments dans un GridView. Mon problème est que j'ai un GridView avec une cellule pour chaque jour de la semaine, et chaque cellule contiendra le même ou des contrôles similaires. Pour les contrôles qui sont identiques, il serait bien de les nommer tous comme "lblPersonName". Toutefois, si vous faites cela, vous ne pouvez pas utiliser FindControl(), car il se plaindra qu'il existe des contrôles avec des ID en double dans la ligne. La racine du problème est que le conteneur de nommage pour les contrôles dans un GridView n'est pas la cellule de la table (DataControlFieldCell ou autre), mais c'est le GridViewRow.Conteneur de nommage personnalisé pour ASP.NET GridView?

Je ne sais pas s'il existe un moyen de le faire, mais ce serait bien de pouvoir échanger le conteneur de dénomination par défaut afin que la cellule devienne le conteneur de nommage, et je pourrais juste avoir les mêmes noms de contrôle.

Accordé, le ASPX pour cela commence à avoir un peu grand - je commence à voudrais avoir commencé le projet hors dans ASP.NET MVC ....

Dans tous les cas, je suis ouvert à d'autres alternatives en ce qui concerne la façon d'implémenter un GridView avec des contrôles comme celui-ci. À ce stade, il peut être plus simple d'utiliser simplement une vieille table et d'ajouter dynamiquement les contrôles ...

Pour clarification: - Chaque colonne est définie avec un ItemTemplate, et les contrôles résident dans ItemTemplate. - La seule façon de le faire fonctionner maintenant est d'avoir "lblPersonNameOne", "lblPersonNameTwo", etc.

Répondre

1

En fait, il semble que cela pourrait être assez facile ... ce que j'expérimente en ce moment, c'est que j'ai créé un contrôle de serveur client héritant de asp: Panel, mais il implémente INamingContainer. Lorsque vous implémentez cela, il insère automatiquement l'ID du contrôle dans le flux ID unique des contrôles enfants. Ainsi, vous pouvez ajouter les contrôles de chaque modèle avec les mêmes ID (dynamiquement ou déclarativement), et ils auront leur propre ID. Ensuite, il suffit d'utiliser FindControl sur la cellule elle-même, pas sur la ligne, et il trouvera le contrôle avec l'ID recherché + l'extension ID unique. La solution ci-dessus fonctionne, mais il peut être tout aussi simple et plus simple de placer tous les contrôles nommés dans un ancien contrôle utilisateur ascx, qui implémente INamingContainer. Ensuite, vous pouvez l'utiliser comme vous le feriez normalement. Le seul inconvénient de l'utilisation d'un contrôle utilisateur est que vous ne pouvez pas accéder aussi facilement aux sources de données sur la page parent, et des choses comme ça. Toujours possible, bien sûr, passer par le parent, mais pas aussi déclaratif.

0

Que faire si vous avez fait de chaque colonne un TemplateField, et déclaré les contrôles dans le modèle. De cette façon, chaque contrôle devra avoir un identifiant unique.

+0

Chaque colonne est un champ de modèle et les contrôles sont déclarés dans le modèle. Donc, par exemple, j'ai deux colonnes, ColOne et ColTwo, et chacune d'elles a un contrôle nommé "lblPersonName" dans la définition de modèle. Si vous appelez FindControl() dans cette situation, vous obtenez une exception. Vous devez donc nommer les libellés "lblPersonNameOne" et "lblPersonNameTwo". Ce qui peut être beaucoup si vous avez beaucoup de contrôles. –

+0

Je pense que "trop ​​de contrôles" est votre problème racine. Mais la solution la plus simple consiste simplement à donner à chaque contrôle un identifiant unique. Créer un conteneur de nommage personnalisé est, IMO, beaucoup trop de frais généraux. –