我对.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已经有了一个定义。
我想我在这里错过了一些非常简单的东西,但我不确定它是什么。谁能告诉我我做错了什么?非常感谢!
答案 0 :(得分:2)
在呈现控件之前调用Page_PreInit。尝试将您的代码添加到Page_Load方法。
中的生命周期事件部分答案 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相同。