web-dev-qa-db-fra.com

Trouver le contrôle dans la page

Html

<body>
    <form id="form1" runat="server">    
       <asp:Button runat="server" ID="a" OnClick="a_Click" Text="apd"/>    
    </form>
</body>

Code

protected  void a_Click(object sender,EventArgs e)
{
    Response.Write(((Button)FindControl("a")).Text);

}

Ce code fonctionne bien.

Cependant, ce code:

Html

 <%@ Page Title="" Language="C#" MasterPageFile="~/Student/MasterPage.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Student_Default" %>


<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <asp:Button runat="server" ID="a" OnClick="a_Click" Text="andj"/>
</asp:Content>

Code

protected void a_Click(object sender, EventArgs e)
{
    Response.Write(((Button)FindControl("a")).Text);
}

Ce code ne fonctionne pas et FindControl renvoie Null - pourquoi est-ce?

La méthode FindControl fonctionne dans une page simple, mais dans une page principale, ne fonctionne-t-elle pas?

L'ID du a est modifié en ctl00_ContentPlaceHolder1_a - Comment trouver le contrôle?

10
user1263390

Pour trouver le bouton de votre page de contenu, vous devez rechercher le ContentPlaceHolder1 contrôle en premier. Utilisez ensuite la fonction FindControl sur le ContentPlaceHolder1 Contrôle de la recherche de votre bouton:

 ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.FindControl("ContentPlaceHolder1");
 Response.Write(((Button)cph.FindControl("a")).Text);
31
Hans

Vous pouvez essayer cela ..

this.Master.FindControl("Content2").FindControl("a");

Vous pouvez renvoyer cet article ...

http://www.west-wind.com/weblog/posts/2006/apr/09/aspnet-20-Masterpages-and-finindcontrol

4
Chen G

si la page à rechercher n'a pas de page maître

this.Page.Master.FindControl("ContentPlaceHolder1");

else

this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");
1
john carlo

Ceci est probablement due à la manière dont ASP.NET Noms les identifiants clients pour les commandes imbriquées. Regardez la source de la page et voyez exactement ce que ASP.NET nomme votre contrôle.

Par exemple, en regardant ma page, je peux voir que le bouton dans le centre de contenu rend comme ceci:

<input type="submit" name="ctl00$ContentPlaceHolder1$btn1" value="hello" id="MainContent_btn1" />

Dans ce cas, FindControl ("CTL00 $ ContentplaceLeLder1 $ BTN1") renvoie une référence au bouton.

0
McGarnagle
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
       Button img = (Button)cph.FindControl("btncreate_email");
0
Joydip Roy

les contrôles sont imbriqués. Vous avez votre page, à l'intérieur de la page, vous trouverez plus de contrôles, certains de ces contrôles contiennent des contrôles eux-mêmes. La méthode FindControl recherche uniquement le conteneur de nommage actuel ou si vous faites page .FindControls si vous recherchez uniquement les commandes de la page, non dans les commandes à l'intérieur de ces contrôles, vous devez donc rechercher de manière récursive.

si vous savez que le bouton est à l'intérieur du support de lieu de contenu et que vous connaissez son identifiant, vous pouvez faire:

ContentPlaceHolder cph = Page.FindControl("ContentPlaceHolder1");
Response.Write(((Button)cph.FindControl("a")).Text);

sinon, si vos commandes sont profondément imbriquées, vous pouvez créer une fonction récursive pour la recherche:

private void DisplayButtonText(ControlCollection page)
{
   foreach (Control c in page)
   {
      if(((Button)c).ID == "a")
      {
         Response.Write(((Button)c).Text);
         return null;
      }
      if(c.HasControls())
      {
         DisplayButtonText(c.Controls);
      }
}

initialement, vous passeriez cette page.Controls

0
e wagness

Cela devrait trouver n'importe quel contrôle sur la page

private Control FindALL(ControlCollection page, string id)
{
  foreach (Control c in page)
  {
    if (c.ID == id)
    {
      return c;
    }

    if (c.HasControls())
    {
      var res = FindALL(c.Controls, id);

      if (res != null)
      {
        return res;
      }
    }     
  }
  return null;
}

Appel comme:

Button btn = (Button)FindALL(this.Page.Controls, "a");
btn.Text = "whatever";
0
eugeniy

Pour trouver le contrôle de page maître sur les autres pages, nous pouvons utiliser ceci:

Button btnphotograph = (Button)this.Master.FindControl("btnphotograph");
btnphotograph.Text="Hello!!";
0
Joydip Roy