2009-09-22 12 views
8

Es tut mir leid, aber ich kann nicht verstehen, warum das nicht funktioniert. Nach dem Kompilieren bekomme ich eine "Null Reference Exception". Bitte helfen Sie.C#, FindControl

public partial class labs_test : System.Web.UI.Page 
{ 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     if (TextBox1.Text != "") 
     { 
      Label Label1 = (Label)Master.FindControl("Label1"); 
      Label1.Text = "<b>The text you entered was: " + TextBox1.Text + ".</b>"; 
     } 
    } 

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

und UI:

<%@ 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> 
+0

Woher bekommen Sie die Null-Referenz-Ausnahme? – Joren

+0

Label1.Text = "Sie haben " + DropDownList1.SelectedValue + " aus dem Dropdown-Menü ausgewählt."; – AlexC

+0

Mögliche doppelte http://stackoverflow.com/questions/799655/asp-net-findcontrol-is-not-working-how-come –

Antwort

22

Mit freundlicher Genehmigung von Mr. Atwood himself, hier ist eine rekursive Version der Methode. Ich würde auch empfehlen, auf Null für das Steuerelement zu testen, und ich fügte hinzu, wie Sie den Code ändern können, um das auch zu tun.

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; 
} 
+0

Vielen Dank !!!!!!! – AlexC

+2

Gut, wenn FindControl verwendet werden muss, aber im Beispiel dieser Frage ist FindControl übertrieben. – CRice

2

FindControl sucht nur in den unmittelbaren Kindern (technisch auf die nächsten NamingContainer), nicht der gesamten Steuerbaum. Da Label1 kein unmittelbares Kind von Master ist, wird Master.FindControl es nicht finden. Stattdessen müssen Sie entweder FindControl auf der unmittelbar übergeordneten Steuerung zu tun, oder eine rekursive Steuer-Suche:

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

(Beachten Sie dies als extension method bequem ist).

3

Wenn Label1 existiert auf der Masterseite:

Wie über die Content-Seite zu sagen, wo die Masterseite

<%@ MasterType VirtualPath="~/MasterPages/PublicUI.Master" %> 

Dann macht ein Verfahren, in dem Meister wie

public void SetMessage(string message) 
{ 
    Label1.Text = message; 
} 
ist

Und rufen Sie es in Seitencode hinter.

Master.SetMessage("<b>You chose <u>" + DropDownList1.SelectedValue + "</u> from the dropdown menu.</b>"); 

Wenn Label1 auf der Seite Inhalt existiert

Wenn es einfach auf der gleichen Seite ist, rufen Sie einfach Label1.Text = somestring; oder wenn Sie aus irgendeinem Grund FindControl verwenden müssen, ändern Sie Ihre Master.FindControl zu FindControl

+0

+1, löschte meine Antwort. Dies ist ein viel einfacherer Weg, um zu erreichen, was Sie wollen. – Kelsey

Verwandte Themen