FindControl per i controlli annidati in UserControl restituisce null
-
25-09-2019 - |
Domanda
Ho un problema molto strano. Ho un UserControl che ha alcuni controlli all'interno. Voglio riferirmi questi controlli dopo, in un altro postback. Ma quando provo a farli proprietà Controls
della mia controlli restituisce null.
Sto lavorando a VS2008.
Ecco il codice di esempio:
public partial class MyUserControl : System.Web.UI.UserControl, INamingContainer
{
protected void Page_Load(object sender, EventArgs e)
{
foreach (Control control in this.Controls)
{
Response.Write(control.ClientID);
}
}
private void MyTable()
{
Table table = new Table();
TableRow row = new TableRow();
TableCell cell = new TableCell();
CheckBox check = new CheckBox();
check.ID = "theId";
check.Text = "My Check";
check.AutoPostBack = true;
cell.Controls.Add(check);
row.Cells.Add(cell);
check = new CheckBox();
check.ID = "theOther";
check.AutoPostBack = true;
check.Text = "My Other Check";
cell = new TableCell();
cell.Controls.Add(check);
row.Cells.Add(cell);
table.Rows.Add(row);
this.Controls.Add(table);
}
protected override void Render(HtmlTextWriter writer)
{
MyTable();
base.Render(writer);
}
}
e la pagina Default.aspx è qualcosa di simile:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.cs" Inherits="Tester.Default" %>
<%@ Register TagPrefix="uc1" TagName="MyControl" Src="~/MyUserControl.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>Unbenannte Seite</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<uc1:MyControl ID="MyControlInstance" runat="server" />
</div>
</form>
</body>
</html>
Non so se mi sono perso in qualche parte del ciclo di vita ASP.NET. Ma questa situazione mi sta facendo impazzire. Qualsiasi aiuto sarebbe molto grato.
Soluzione
Crea i tuoi controlli figlio (MyTable
) sia in CreateChildControls
o OnInit
:
protected override void CreateChildControls()
{
MyTable();
base.CreateChildControls();
}
o
protected override void OnInit(object sender, EventArgs e)
{
MyTable();
base.OnInit(e);
}
Si dovrebbe / non è possibile creare controlli Render
come si verifica dopo Page_Load
. Vedere la pagina ASP.Net Lifecycle qui .
Altri suggerimenti
Credo che sia perché si verifica l'evento Render
dopo Page_Load
, in modo che quando si sta cercando di iterare la vostra collezione di controllo, non è stato impostato ancora. La maggior parte soluzione comune è quello di sovrascrivere CreateChildControls
per ottenere il corretto verso il basso di temporizzazione.