【问题标题】:Asp.net code behind not able to access controls in ascx后面的 Asp.net 代码无法访问 ascx 中的控件
【发布时间】:2012-03-07 15:54:15
【问题描述】:

我是 .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!";
    }

}

如您所见,很简单,我要做的就是以编程方式更改标签的文本属性。但是,当我运行它时,我得到了 NullReferenceException,userLabel 未设置为对象的实例。 userLabel 不应该是我的 _Default 类的属性吗?我尝试将 userLabel 显式设置为属性,但出现编译时错误,提示 userLabel 已经有定义。

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

【问题讨论】:

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


    【解决方案1】:

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

    请参阅http://msdn.microsoft.com/en-us/library/ms178472.aspx 中的生命周期事件部分

    【讨论】:

      【解决方案2】:

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

      像您这样设置值通常应该在 Load 事件中执行,或者至少在页面 Init 事件触发之后执行。

      【讨论】:

        【解决方案3】:

        如您所见here,在 page_perinit 中您无法访问控制,因为它们不存在。

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            首先,您不能简单地使用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;
            }
            

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

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

            父页面的Page_Load会在用户控件的页面加载之前调用,应该没问题。

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                猜你喜欢
                • 2011-09-05
                • 2023-04-05
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-04-03
                • 2010-11-21
                相关资源
                最近更新 更多