【问题标题】:FindControl for nested controls in UserControl returns nullUserControl 中嵌套控件的 FindControl 返回 null
【发布时间】:2011-04-06 06:46:13
【问题描述】:

我有一个非常奇怪的问题。我有一个 UserControl,里面有一些控件。我想在另一个回发中引用这些控件。但是当我尝试获取它们时,我的控件的 Controls 属性返回 null。 我正在开发 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 生命周期的某些部分。但这种情况让我抓狂。任何帮助将不胜感激。

【问题讨论】:

    标签: asp.net user-controls findcontrol


    【解决方案1】:

    我相信这是因为Render 事件发生在Page_Load 之后,所以当您尝试迭代控件集合时,它还没有设置好。最常见的解决方案是覆盖 CreateChildControls 以降低正确的时间。

    【讨论】:

      【解决方案2】:

      CreateChildControlsOnInit 中创建您的子控件(MyTable):

      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

      【讨论】:

      • 你是对的。现在我想问你。每次页面回发时都应该创建表吗?或者有办法将其保存在内存中以便以后处理。
      • 你应该每次都重新创建它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2019-01-09
      • 2013-03-16
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多