2010-08-31 33 views
0

我有一个很奇怪的问题。我有一个UserControl,里面有一些控件。我想在之后的另一个回传中引用这些控件。但是,当我尝试获取它们时,我的控件的Controls属性返回null。 我正在处理vs2008。UserControl中的嵌套控件的FindControl返回null

下面是示例代码:

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

和Default.aspx页面是一样的东西:

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

我不知道如果我在ASP的某些部分,我迷路了.NET生命周期。但这种情况让我发疯。任何帮助将非常感激。

回答

4

创建子控件在任何CreateChildControlsOnInitMyTable):

protected override void CreateChildControls() 
{ 
    MyTable(); 
    base.CreateChildControls(); 
} 

或者

protected override void OnInit(object sender, EventArgs e) 
{ 
    MyTable(); 
    base.OnInit(e); 
} 

你不应该/在Render不能创建控件,因为它Page_Load后发生。请参阅ASP.Net页面生命周期here

+0

你是对的。现在我想问你。每次页面回传时应该创建表格?或者有办法将它保存在内存中以便稍后处理。 – Lug 2010-08-31 14:25:40

+0

你应该每次重新创建它。 – GenericTypeTea 2010-08-31 15:06:47

0

我认为这是因为Render事件发生在Page_Load之后,因此当您尝试迭代控件集合时,它尚未设置。最常见的解决方案是覆盖CreateChildControls以获得适当的时间。