在超类中的代码中找不到控件

时间:2010-02-12 09:55:51

标签: c# .net asp.net findcontrol

我有多个页面

<%@ Page Language="C#" AutoEventWireup="True" CodeBehind="MyPage.aspx.cs" Inherits="MyPage " MasterPageFile="~/Site.master"  %>
<asp:Content ContentPlaceHolderID="commonForm" runat="server">
 <asp:Table runat="server">
  <asp:TableRow>
   <asp:TableCell ID="cellControl" />
  </asp:TableRow>
 </asp:Table>
</asp:Content>

public partial class MyPage : MySuperPage { }

和他们的超级课程:

public abstract class MySuperPage : Page
{
    public MySuperPage()
    {
        this.Load += new EventHandler(PageLoad);
    }

    // my own method
    protected void PageLoad(object sender, EventArgs e)
    {
        var c = this.FindControl("cellControl"); // null!
    }

    // auto event handling
    protected void Page_Load(object sender, EventArgs e)
    {
        var c = this.FindControl("cellControl"); // null!
    }
}

为什么这两种方法都找不到这种控制?

2 个答案:

答案 0 :(得分:1)

我见过的最常见的解决方案是在控制树下进行递归下降,直到找到具有所需ID的控件,例如: https://blog.codinghorror.com/recursive-pagefindcontrol/

答案 1 :(得分:0)

在我看来,你试图在页面控件集合中找到控件有什么问题。您必须在Table控件中搜索表格单元格。

UPD。如果您使用母版页,则可以直接从页面访问其控件。首先,您必须声明主类型:

<%@ MasterType VirtualPath="~/MasterPage.master" %>

然后声明公共属性(也可以是一些控件):

public string MyTitle
{
    get { return "BaseMaster Title"; }
}

然后你就可以写:

string text = Master.MyTitle;

Master.FindControl('Table1');