.FindControl renvoie toujours null
J'ai deux méthodes. La première crée un tableau dynamiquement, et j'ajoute que le tableau dans un espace Réservé.
private void generateData(){
Table tbl = new Table();
tbl.ID = "table1";
holder_info.Controls.Add(tbl);
//...adding tr's and td's....
//...adding CheckBox in tds....
}
Si je ne .FindControl("...") à l'intérieur de cette méthode, je peux trouver le contrôle à l'aide:
CheckBox check = (CheckBox)holder_info.FindControl("checkbox1");
C'est OK, mais pas ce que je prétends.
Dans la deuxième méthode, je veux vérifier si l'utilisateur a coché la case et fait quelque chose, mais je ne trouve pas le contrôle (il renvoie toujours null).
protected void saveInfo_Click(object sender, ImageClickEventArgs e)
{
CheckBox check = (CheckBox)holder_info.FindControl("checkbox1");
if(check.checked){ ... }
}
Aussi, si j'essaie de trouver le contrôle "table1", j'obtiens la valeur null.
Pourquoi cela se produit?
assurez-vous. Va ici: Vraiment Comprendre les Contrôles Dynamiques
OriginalL'auteur oteal | 2012-08-22
Vous devez vous connecter pour publier un commentaire.
C'est parce que vous ajoutez un contrôle dynamique à la page, et lorsque vous cliquez sur le bouton de page obtenir un postback et supprimer les ajouter dynamiquement des contrôles. C'est pourquoi il n'est pas en mesure de trouver le contrôle de case à cocher dans l'événement click du bouton.
Pour les contrôles dynamiques, consultez l'article En conservant l'État pour créer Dynamiquement des Contrôles dans ASP.NET applications (Le Projet de Code).
OriginalL'auteur Pranay Rana
FindControl()
ne trouve que les enfants immédiats, et non les enfants de ces enfants.À faire ce que vous voulez, vous aurez besoin d'écrire une routine pour trouve de façon récursive les contrôles enfants.
Alors vous devez être plus précis sur l'endroit où vous appelez
FindControl()
. Il n'est pas dans la même méthode, lorsque vous ajoutez ces éléments implicites dans votre question, mais plutôt au cours d'une publication, alors il serait vide.yap. et c'est ce que j'ai dit dans mon post! si je fais la même méthode je peux obtenir le contrôle, mais si elle ins-je pas nul...
OriginalL'auteur Jonathan Wood
Comme Pranay expliqué, c'est parce que vous ajoutez des contrôles dynamiquement. Vous avez besoin de reconstruire la page telle qu'elle était avant la publication. En outre, le Tableau de contrôle n'est pas une bonne webcontrol quand il s'agit de se souvenir de ce qui l'information a été affichée précédemment. Vous pourriez avoir plus de chance avec un Répéteur, un DataList, ou un contrôle DataGrid. Une comparaison est disponible dans Décider Quand Utiliser la grille de données, DataList ou Répéteur (MSDN).
À démontrer, je peux vous en montrer un petit exemple de comment vous pouvez aller sur la mise en œuvre de la Répétition, qui est simplement l'un des contrôles de l'OMI. Ainsi, au lieu de l'ajout d'une table dans une publication (comme un clic sur un bouton) il suffit d'ajouter le répéteur dans le balisage, et visible lorsque vous souhaitez afficher les données. De cette façon, vous n'avez même pas à vous soucier des contrôles dynamiques, il est là quand vous en avez besoin.
Ainsi, une base de balisage pour un répéteur avec une case à cocher est comme suit.
Comme vous pouvez le voir, le tableau est construit manuellement (vous pouvez utiliser la grille de données à la place si vous ne voulez pas le faire). Maintenant vous pouvez avoir une classe qui est votre modèle, quelque chose comme:
Et un dernier de la classe qui "répond aux besoins" de la vue (comme dans votre page web de contrôle). Note supplémentaires de la propriété IsChecked, il ne devrait pas être une partie du modèle (comment est une personne vérifié?), mais il s'intègre bien dans le viewmodel de la classe.
Ok, donc sur le code derrière. Lors de l'utilisation de la répétition, vous avez besoin de le lier à une liste. Un exemple de quelque chose qui hérite de IEnumerable sera très bien, alors vous avez besoin de le brancher.
Dans votre code derrière pour votre page, ajoutez ces méthodes.
Maintenant, vous appelez simplement
myTable.DataBind()
chaque fois que les conditions sont remplies, par exemple lorsque vous cliquez sur un bouton. Lorsque vous cliquez sur un bouton et la nécessité de vérifier les cases sont cochées, vous pouvez utiliser lerepeater.Items
propriété de les réitérer, quelque chose comme ceci:OriginalL'auteur Patrick