在Page_Load上,LoadControl加载的控件上的控件为null

时间:2014-11-24 17:14:05

标签: c# asp.net webforms user-controls

我有一个由LoadControl加载的用户控件,并且对于所述用户控件的代码,我尝试访问一个null的控件。

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

    // ...

}

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

1 个答案:

答案 0 :(得分:0)

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