Asp.net代码背后无法访问ascx中的控件

时间:2012-03-07 15:54:15

标签: asp.net .net visual-studio-2010

我对.NET场景很陌生,并且在一个简单的asp.net应用程序中遇到了一个小问题,并且在后面的代码中访问了.ascx文件中定义的控件。

这是我的Default.ascx文件:

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" %>

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <p>
        <asp:Label AssociatedControlID = "userText" AccessKey = "L" runat="server"                       ID="userLabel">Username</asp:Label>
        <asp:TextBox ID = "userText" runat="server" MaxLength="20" ></asp:TextBox>
    </p>
</asp:Content>

这是Default.aspx.cs文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Page_PreInit(object sender, EventArgs e)
    {   
        userLabel.Text = "Hello!";
    }

}

正如您所看到的,非常简单,我想要做的就是以编程方式更改标签的text属性。但是当我运行它时,我得到一个NullReferenceException,userLabel没有设置为对象的实例。 userLabel不应该是我的_Default类的属性吗?我尝试将userLabel显式设置为属性但是我得到一个编译时错误,说userLabel已经有了一个定义。

我想我在这里错过了一些非常简单的东西,但我不确定它是什么。谁能告诉我我做错了什么?非常感谢!

6 个答案:

答案 0 :(得分:2)

在呈现控件之前调用Page_PreInit。尝试将您的代码添加到Page_Load方法。

请参阅http://msdn.microsoft.com/en-us/library/ms178472.aspx

中的生命周期事件部分

答案 1 :(得分:1)

控件在初始化之前不可用;尚未在PreInit事件中创建控件,这就是您无法访问它的原因。

您正在进行的设置值通常应在Load事件中执行,或者至少在触发页面Init事件之后执行。

答案 2 :(得分:1)

正如您可以阅读here,在page_perinit中,您无法访问控件,因为它们不存在。

这是一个很好的做法,在此活动期间应用主题和个性化,而不是访问控件的状态

答案 3 :(得分:1)

控件初始化应在Page_Init上完成。

protected void Page_Init(object sender, EventArgs e)
{
    userLabel.Text = "Hello!";
}

答案 4 :(得分:1)

首先,您不能简单地使用userLabel.Text访问用户控件中的标签。您需要在父页面中使用Label lbl = (Label)UserControlID.FindControl("userLabel");。 (但你需要的是从父页面中在UserControl中设置标签。)

所以我会这样做:

将属性放在UserControl中:

public string UserName {get; set;}
protected void Page_Load(object sender, EventArgs e)
{
    userLabel.Text = this.UserName;
}

在父页面的页面加载事件中,设置属性值:

protected void Page_Load(object sender, EventArgs e)
{
    UserControlID.UserName = "Hello!";
}

父页面的Page_Load将在usercontrol的页面加载之前调用,它应该没问题。

答案 5 :(得分:0)

我没有看到任何名为userLabel的标签。您的标签名称似乎与userText相同。