【问题标题】:NullReferenceException on setting label text of a custom user web control设置自定义用户 Web 控件的标签文本时出现 NullReferenceException
【发布时间】:2013-03-06 20:28:19
【问题描述】:

我正在尝试将自定义用户 Web 控件的标签文本设置为

Email em = new Email(); //Email is the class of the custom user web control
em.setEmail(email);
Panel2.Controls.Add(em);

控件中的setEmail()函数将标签lblEmail的值设置为

public void setEmail(string recEmail)
{
        lblEmail.Text = recEmail;
}

但我收到以下错误:

调试时我看到recEmail 正在获取所提供的值。但不将其分配给lblEmail.Text

我以为可能是控件注册问题,所以注册为

<%@ Register Src="~/Email.ascx" tagname="Email" TagPrefix="uc1" %>

我也尝试在 setEmail() 函数中设置值,如下所示:

public void setEmail(string recEmail)
{
        string a=recEmail;
        lblEmail.Text = a;
}

调试时这表明a 正在获取recEmail 的值,但它没有分配给lblEmail.Text

由于无法上传完整代码,请注意以下几点:

  1. 名为 Panel2 的面板位于 UpdatePanel 中,在将电子邮件控件添加到面板后会进行有条件更新。
  2. Email.ascx 文件位于调用它的文件的父文件夹中。表示如果 Email.ascx 位于 A 文件夹中,则调用它的文件位于 A/B 文件夹中。但我不认为这会产生影响。刚刚提到是为了向您提供有关情况的完整信息。

请告诉我该怎么做才能解决这个问题?

【问题讨论】:

    标签: c# asp.net c#-4.0 custom-controls nullreferenceexception


    【解决方案1】:

    默认情况下,用户控件的成员在初始化之前都是空的。并且初始化不会发生在用户控件(和页面,可能还有其他一些类似类型)的构造函数中。它们发生在控件被“加载”到某种上下文中时。

    而不是像这样初始化:

    Email em = new Email();
    

    看看the LoadControl() method。你应该像这样初始化它:

    Email em = (Email)LoadControl("Email.ascx");
    

    这将通过触发其内置页面生命周期事件来初始化用户控件,在该事件中初始化其 UI 控件。

    【讨论】:

    • @ShivaPareek:有趣的是,在链接的 MSDN 页面中,他们在示例中使用了 .cs。我想无论哪种方式都足够好。
    • 不知道,但这给出了找不到 lblEmail 的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多