C #, FindControl

Lo siento, pero no puedo entender por qué esto no funciona. Después de la comstackción, recibo una “excepción de referencia nula”. Por favor ayuda.

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 = "The text you entered was: " + TextBox1.Text + "."; } } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { Label Label1 = (Label)Master.FindControl("Label1"); Label1.Text = "You chose " + DropDownList1.SelectedValue + " from the dropdown menu."; } } 

y UI:

     Type in text and then click button to display text in a Label that is in the MasterPage.
This is done using FindControl.


Choose an item from the below list and it will be displayed in the Label that is in the MasterPage.
This is done using FindControl.
Item 1 Item 2 Item 3

Cortesía del propio Sr. Atwood , aquí hay una versión recursiva del método. También recomendaría probar nulo en el control e incluí cómo puedes cambiar el código para hacer eso también.

 protected void Button1_Click(object sender, EventArgs e) { if (TextBox1.Text != "") { Label Label1 = FindControlRecursive(Page, "Label1") as Label; if(Label1 != null) Label1.Text = "The text you entered was: " + TextBox1.Text + "."; } } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { Label Label1 = FindControlRecursive(Page, "Label1") as Label; if (Label1 != null) Label1.Text = "You chose " + DropDownList1.SelectedValue + " from the dropdown menu."; } 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; } 

Cuando Label1 existe en la página maestra:

¿Qué tal decirle a la página de contenido donde está tu página maestra?

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

Luego haciendo un método en el maestro como

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

Y llámalo en el código de la página detrás.

 Master.SetMessage("You chose " + DropDownList1.SelectedValue + " from the dropdown menu."); 

Cuando Label1 existe en la página de contenido

Si está simplemente en la misma página, simplemente llame a Label1.Text = someString; o si por alguna razón necesita usar FindControl, cambie su Master.FindControl para FindControl

FindControl solo busca en los elementos FindControl inmediatos (técnicamente en el siguiente NamingContainer ), no en el árbol de control completo. Como Label1 no es un hijo Master.FindControl de Master , Master.FindControl no lo localizará. En su lugar, debe realizar FindControl en el control primario inmediato o realizar una búsqueda de control recursivo:

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

(Tenga en cuenta que esto es conveniente como método de extensión ).