9
votes

C #, FindControl

Je suis désolé, mais je ne peux pas comprendre pourquoi cela ne fonctionne pas. Après avoir compilé, je reçois une "exception de référence nulle". S'il vous plaît aider. XXX PRE>

et UI: P>

<%@ Page Language="C#" MasterPageFile="~/MasterPage.master" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="labs_test" Title="Untitled Page" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
Type in text and then click button to display text in a Label that is in the MasterPage.<br />
This is done using FindControl.<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Submit" /><br />
<br />
Choose an item from the below list and it will be displayed in the Label that is
in the MasterPage.<br />
This is done using FindControl.<br />
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged">
<asp:ListItem>Item 1</asp:ListItem>
<asp:ListItem>Item 2</asp:ListItem>
<asp:ListItem>Item 3</asp:ListItem>
</asp:DropDownList>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>    
</asp:Content>


2 commentaires

Où obtenez-vous l'exception de référence NULL?


Label1.text = " Vous avez choisi " + dropdowdlist1.selectedValue + " dans le menu déroulant. ";


3 Réponses :


2
votes

FindControl uniquement sur les enfants immédiats (techniquement à la suivante NamingContainer ), pas l'intégralité de l'arbre de contrôle. Étant donné que Label1 n'est pas un enfant immédiat de maître , maître.findcontrol ne le localisera pas. Au lieu de cela, vous devez soit faire FindControl sur la commande parent immédiate, ou faire une recherche de contrôle récursive: xxx

(Notez que cela est pratique comme un Méthode d'extension ).


0 commentaires

4
votes

lorsque Label1 existe sur la page maître:

Comment diriez-vous de dire la page de contenu où votre page maître est xxx

puis faisant un méthode dans le maître comme xxx

et appelez-le dans le code de la page derrière. xxx

quand Label1 existe sur La page de contenu

Si c'est simplement sur la même page, appelez simplement label1.text = sulsing; Ou si vous avez besoin d'une raison pour une raison quelconque, vous devez utiliser FindControl, modifiez votre maître.FindControl sur FindControl


1 commentaires

+1, a supprimé ma réponse. C'est un moyen beaucoup plus facile d'accomplir ce que vous voulez.



22
votes

Avec la courtoisie de M. Atwood lui-même , voici une version récursive de la méthode. Je recommanderais également des tests pour NULL sur le contrôle et j'ai inclus comment vous pouvez modifier le code pour le faire également.

protected void Button1_Click(object sender, EventArgs e)
{
    if (TextBox1.Text != "")
    {
        Label Label1 = FindControlRecursive(Page, "Label1") as Label;
        if(Label1 != null)
            Label1.Text = "<b>The text you entered was: " + TextBox1.Text + ".</b>";
    }
}

protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
    Label Label1 = FindControlRecursive(Page, "Label1") as Label;
    if (Label1 != null)
        Label1.Text = "<b>You chose <u>" + DropDownList1.SelectedValue + "</u> from the dropdown menu.</b>";
}

private Control FindControlRecursive(Control root, string id)
{
    if (root.ID == id) return root;
    foreach (Control c in root.Controls)
    {
        Control t = FindControlRecursive(c, id);
        if (t != null) return t;
    }
    return null;
}


1 commentaires

Bon pour quand FindControl doit être utilisé, mais dans cette question, la recherche de la contence est surchargée.