C# LoadControl加载的控件上的控件在加载页面上为空

C# LoadControl加载的控件上的控件在加载页面上为空,c#,asp.net,webforms,user-controls,C#,Asp.net,Webforms,User Controls,我有一个由LoadControl加载的用户控件,在所述用户控件的代码后面,我尝试访问一个空的控件 Default.aspx: protected void Page_Load(object sender, EventArgs e){ // ... List<String> usersCustomers = custRepo.GetUserCustomers(currentUser.ID).Select(s => s.custName).ToList(); F

我有一个由LoadControl加载的用户控件,在所述用户控件的代码后面,我尝试访问一个空的控件

Default.aspx:

protected void Page_Load(object sender, EventArgs e){

    // ...

List<String> usersCustomers = custRepo.GetUserCustomers(currentUser.ID).Select(s => s.custName).ToList();
    FileTrackingControl fileTrackingControl = (FileTrackingControl)LoadControl(typeof(FileTrackingControl), new object[] { usersCustomers, currentUser });
    dashboardWidgetPanel.Controls.Add(fileTrackingControl);

    // ...

}
public partial class FileTrackingControl : System.Web.UI.UserControl
{
    List<string> _custNames;
    User _currentUser;

    public FileTrackingControl(List<string> custNames, User currentUser)
    {
        this._custNames = custNames;     
        this._currentUser = currentUser;
    }

    protected void Page_OnInit(object sender, EventArgs e)
    {

        StatToCwData scData = new StatToCwData();

        GridView fileTrackingResultsFC = (GridView)FindControl("fileTrackingResults");

        // CRASH HERE. NPE: fileTrackingResults is NULL
        fileTrackingResults.DataSource = scData.GetControlData(6, _currentUser, _custNames);
        fileTrackingResults.DataBind();
    }
}
受保护的无效页面加载(对象发送方,事件参数e){
// ...
列出usersCustomers=custRepo.GetUserCustomers(currentUser.ID);
FileTrackingControl FileTrackingControl=(FileTrackingControl)LoadControl(typeof(FileTrackingControl),新对象[]{usersCustomers,currentUser});
dashboardWidgetPanel.Controls.Add(fileTrackingControl);
// ...
}
FileTrackingControl.ascx:

protected void Page_Load(object sender, EventArgs e){

    // ...

List<String> usersCustomers = custRepo.GetUserCustomers(currentUser.ID).Select(s => s.custName).ToList();
    FileTrackingControl fileTrackingControl = (FileTrackingControl)LoadControl(typeof(FileTrackingControl), new object[] { usersCustomers, currentUser });
    dashboardWidgetPanel.Controls.Add(fileTrackingControl);

    // ...

}
public partial class FileTrackingControl : System.Web.UI.UserControl
{
    List<string> _custNames;
    User _currentUser;

    public FileTrackingControl(List<string> custNames, User currentUser)
    {
        this._custNames = custNames;     
        this._currentUser = currentUser;
    }

    protected void Page_OnInit(object sender, EventArgs e)
    {

        StatToCwData scData = new StatToCwData();

        GridView fileTrackingResultsFC = (GridView)FindControl("fileTrackingResults");

        // CRASH HERE. NPE: fileTrackingResults is NULL
        fileTrackingResults.DataSource = scData.GetControlData(6, _currentUser, _custNames);
        fileTrackingResults.DataBind();
    }
}
public部分类FileTrackingControl:System.Web.UI.UserControl
{
列出客户名称;
用户\u当前用户;
公共文件跟踪控件(列出客户名称、用户当前用户)
{
这是._custNames=custNames;
这。_currentUser=currentUser;
}
受保护的无效页\u OnInit(对象发送方,事件参数e)
{
StatToCwData scData=新的StatToCwData();
GridView文件跟踪入口结果SFC=(GridView)FindControl(“文件跟踪入口结果”);
//在此崩溃。NPE:fileTrackingResults为空
fileTrackingResults.DataSource=scData.GetControlData(6,_currentUser,_custNames);
fileTrackingResults.DataBind();
}
}

基于您确实有一个ID为fileTrackingResults的网格视图(总是值得仔细检查!),那么我认为您正在尝试在创建控件之前访问它们(我记得MS说过您不应该在oninit事件中访问控件树)。在您的情况下,可能只是简单地将代码移动到Page_Load事件中,或者创建Page_PreLoad事件并手动映射事件处理程序(如果您需要为某些其他类型的功能保留Page_Load)。或者,您可以在用户控件上创建LoadData类型方法并手动启动它(使用接口声明该方法,以便可以跨其他代码滚动该方法)

它现在在OnInit中,因为Load和PreLoad不起作用,我在搜索的其他一些堆栈帖子中看到了它。然而,这也不起作用。我不熟悉接口,接口如何允许我转换到其他代码?如果您以前没有使用过接口,它可能不会为这个特定示例添加任何内容。但是,基于您可能有几个其他组件,所有这些组件都是用LoadControl加载的,然后通过使用一个接口,您可以定义一个通用方法名,而无需在页面中写入不同的处理。最简单的解决方案是在您的控件上创建LoadData方法,将代码移到其中,然后,在LoadControl调用之后,立即调用LoadData方法。