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?
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);
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
si la page à rechercher n'a pas de page maître
this.Page.Master.FindControl("ContentPlaceHolder1");
else
this.Page.Master.FindControl("ContentPlaceHolder1").FindControl("controlAFromPage");
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.
ContentPlaceHolder cph = (ContentPlaceHolder)this.Master.Master.FindControl("ContentPlaceHolder1");
Button img = (Button)cph.FindControl("btncreate_email");
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
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";
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!!";