c# - erreur à l'aide de FindControl sur les div id
J'ai un ASP.NET site que je suis en train d'essayer d'accéder à des éléments div, par leur ID dans le code C# de fichier. Essentiellement, je veux voir si un élément div existe, et si oui, de modifier ses propriétés.
J'ai trouvé beaucoup de ressources sur ce point à une douzaine de différentes solutions et aucun d'eux ne semble fonctionner.
HTML sur ASP.Net Page:
<div class="contentArea">
<div class="block" id="button1" runat="server">
Some Content Here
</div>
<div class="block" id="button2" runat="server">
Some Content Here
</div>
<div class="block" id="button3" runat="server">
Some Content Here
</div>
</div>
Code C# Derrière (les exemples que j'ai essayé):
System.Web.UI.HtmlControls.HtmlGenericControl div1 = (System.Web.UI.HtmlControls.HtmlGenericControl)this.FindControl("button1");
div1.Attributes["class"] = "classNameHere";
ou
Control div1 = this.FindControl("button1");
div1.GetType();
Lorsque le code arrive à la deuxième ligne de chacun des exemples ci-dessus, j'obtiens une erreur:
Objet de référence non définie à une instance d'un objet.
Si j'essaie suivantes:
if (div1 != null)
{
//Do Something;
}
Il n'arrive jamais rien parce que div1 est toujours la valeur null. Ironiquement, si je regarde la fenêtre variables locales et d'examiner cette question, je peux voir le bouton# id dans la liste, donc je sais qu'ils sont là, mais le système agit comme il n'est pas de trouver le contrôle.
Mon but ultime est de trouver le max id # du bouton de divs (en regardant mon exemple de code html, le max id serait de 3 (bouton3). Peut-être il ya une meilleure façon d'aller à ce sujet, mais de toute façon, une fois que j'ai mon max id, je veux être en mesure de toucher chaque div et de modifier certaines propriétés css.
Bien que je pourrais facilement faire tout cela via jQuery, dans ce cas j'ai besoin de faire cela en C#.
Toute aide est très appréciée. Si vous avez besoin de plus d'info, laissez-moi savoir.
Mise à JOUR
J'ai créé un nouveau C# projet web à partir de zéro. Après l'ajout d'une masterpage (et de ne pas l'altérer) et l'ajout d'un formulaire en ligne à l'aide de masterpage, j'ai seulement ajouté une ligne à webform en vertu de Content ID="Contenu2":
<div id="button1"></div>
Partir de code c# derrière, j'ai encore fonctionner dans exactement le même problème qu'avant.
DERNIÈRE MISE À JOUR ET DE RÉPONDRE À
Je suis choqué personne (y compris moi-même) a attiré mon erreur à partir de ci-dessus mise à jour. Je n'ai jamais mis runat="server" quand je créé un nouveau projet à partir de zéro en vertu de la div. Voici comment j'ai résolu mon problème en vertu de mon nouveau projet à partir de zéro:
Ajouter runat="server" à la div:
<div id="button1" runat="server"></div>
Puis j'ai fait une FindControl sur le ContentPlaceHolder en vertu de la MasterPage:
ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
Note: c'est Ce que le ContentPlaceHolder à quoi ressemble le code sur le Site.Page maître par défaut:
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
Après avoir découvert cette ContentPlaceHolder dans le code derrière, j'ai alors cherché dans cet espace réservé pour button1:
using System.Web.UI.HtmlControls;
HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");
Enfin je vérifier pour voir si myControl est nulle:
if (myControl != null)
{
\\ Do Something
}
Quand j'ai couru ce code, il a trouvé le div que je cherchais. Voici le code complet derrière tous mis ensemble:
using System.Web.UI.HtmlControls;
ContentPlaceHolder myPlaceHolder = (ContentPlaceHolder)Master.FindControl("ContentPlaceHolder1");
HtmlControl myControl = (HtmlControl)myPlaceHolder.FindControl("button1");
if (myControl != null)
{
//Do Something
}
Votre divs sont ID avais
bodyDiv1
, bodyDiv2
, bodyDiv3
, mais vous êtes à la recherche pour un contrôle avec l'ID button1
? Il ya quelque chose que vous n'avez pas inclus dans l'exemple de code?Les divs sont pas dans n'importe quel type de contrôle.
Je m'excuse, j'ai attrapé la mauvaise section de HTML à partir de mon fichier, j'ai mis à jour ci-dessus. La seule différence dans ce que je vous ai donné par rapport à ce que j'ai est qu'il y a plus de divs alors ce que j'ai donné.
Pouvez-vous préciser comment votre code HTML est en cours de création? Si c'est vraiment le HTML pour la page aspx, puis je ne suis pas sûr de savoir pourquoi vous aiic pas seulement ondonneacces
button1
directement, sans l'aide de findControl. Je suppose que il y a quelque chose de plus qui se passe ici, mais ou il serait inutile... je suppose que les divs sont générées dynamiquement sur le serveur ou le client, mais il est très important de savoir qui. Si le client, alors vous devez faire somethign de dire au serveur d'eux ou de ne pas savoir (et donc de ne pas les trouver). Donc, veuillez inclure le code qui génère, si elle existe...OriginalL'auteur JasonH | 2012-07-10
Vous devez vous connecter pour publier un commentaire.
Si votre page est à l'aide d'une MasterPage, la div de contrôle ne sera pas dans la collection principale de contrôles. Cette collection ne contient que des contrôles de Contenu pointant vers le ContentPlaceholder de votre MasterPage.
Il y a trois options:
FindControl
sur le contrôle de Contenu:contentControl.FindControl("button1");
FindControl
jusqu'à ce que vous trouver le contrôle dont vous avez besoinbutton1.Attributes["class"] = "classNameHere";
Mise à jour
J'ai créé une MasterPage, ajout d'une Page de Contenu, et ajouté de la
<div id="button1" runat="server">Some text</div>
à la Page de Contenu.Dans le code-behind de la Page mon Contenu, j'ai ajouté ce code:
Cela fonctionne pour moi.
J'ai mis à jour ma réponse avec un exemple de code qui fonctionne pour moi.
Alors, quand j'ai créé un nouveau site de test à partir de zéro, j'ai oublié d'ajouter runat=server à la div, de sorte que beaucoup de mes tests hier est allé à la poubelle. J'ai essayé ta méthode et ça a fonctionné, j'ai aussi essayé quelques autres htings et cela a fonctionné. Pourquoi il ne fonctionne pas encore sur mon projet normal, c'est autre chose, mais je peut m'adresser à moi-même. Merci!
Oublier runat=server consommer mon heure trop 😀
OriginalL'auteur Kristof Claes
Vous avez besoin d'ajouter un runat=server attribuer à tout contrôle et que vous souhaitez accéder dans le code derrière. Voir cet article pour plus d'aide.
Accès <div> à partir de javascript et le code-behind
runat
attributs.C'est très typique de répondre, mais n'est pas le cas ici. Comme je l'ai dit lorsque l'on regarde les habitants que je peux voir les contrôles, et que Ruel dit, j'ai runat=server dans mon code déjà.
OriginalL'auteur Ashwin Chandran
Je ne peux pas semblent être en mesure de reproduire votre problème, toutes les chances de votre DIV sont à l'intérieur d'un modèle de contrôle telles que l'UpdatePanel, Répéteur, ou de la Grille?
qu'en est
yourContentControl.FindControl("yourdiv")
?Intellisense n'est pas de trouver le contrôle de Contenu (et oui il a un ID unique et a runat=server).
OriginalL'auteur Tianzhen Lin
Si vous ajoutez
runat=server
s'il vous plaît ajouter à la fin de la div:Cela fonctionne
Cependant, ce ne sera pas
En faisant cela, vous pouvez modifier n'importe quelle propriété de code-behind:
Cela fonctionne même avec les masterpages. Le div n'est pas inclus dans une masterpage.
OriginalL'auteur monsieurgutix