2010-08-31 4 views
0

У меня очень странная проблема. У меня есть UserControl, у которого есть некоторые элементы управления внутри. Я хочу передать эти элементы управления после, в другой обратной передаче. Но когда я пытаюсь получить их свойство Controls моих элементов управления возвращает null. Я работаю над vs2008.FindControl для вложенных элементов управления в UserControl возвращает 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

Создать ваши дочерние элементы управления (MyTable) в любом CreateChildControls или OnInit:

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

+0

Вы должны воссоздавать его каждый раз. – GenericTypeTea

0

Я считаю, что это связано с тем, что событие Render происходит после Page_Load, поэтому, когда вы пытаетесь выполнить итерацию своей коллекции управления, она еще не настроена. Наиболее распространенным решением является переопределение CreateChildControls, чтобы получить правильное время.

 Смежные вопросы

  • Нет связанных вопросов^_^