FindControl для вложенных элементов управления в UserControl возвращает ноль - PullRequest
0 голосов
/ 31 августа 2010

У меня очень странная проблема.У меня есть UserControl, который имеет некоторые элементы управления внутри.Я хочу сослаться на эти элементы управления после, в другой постбэк.Но когда я пытаюсь получить их, свойство Controls моих элементов управления возвращает ноль.Я работаю над vs2008.

Вот пример кода:

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.Но эта ситуация сводит меня с ума.Любая помощь была бы очень благодарна.

Ответы [ 2 ]

4 голосов
/ 31 августа 2010

Создайте свои дочерние элементы управления (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 здесь .

0 голосов
/ 31 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...