加载控件加载的控件上的控件在Page_Load时为空

本文关键字:控件 加载 Load Page | 更新日期: 2023-09-27 18:31:42

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

默认值.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);
    // ...
}

FileTrackingControl.ascx:

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();
    }
}

加载控件加载的控件上的控件在Page_Load时为空

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