当前位置:  开发笔记 > 编程语言 > 正文

Asp.net Usercontrol LoadControl问题

如何解决《Asp.netUsercontrolLoadControl问题》经验,为你挑选了1个好方法。

我在使用时遇到问题LoadControl( type, Params ).让我解释...

我有一个超级简单的用户控件(ascx)

<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %>



代码(c#)背后:

public partial class ErrorDisplay : System.Web.UI.UserControl
{

    private Message _ErrorMessage;    

    public ErrorDisplay()
    {
    }

    public ErrorDisplay(Message ErrorMessage)
    {
        _ErrorMessage = ErrorMessage;
    }    

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        if (_ErrorMessage != null)
        {
            lblTitle.Text = _ErrorMessage.Message;
            lblDescription.Text = _ErrorMessage.Description;
        }
    }
}

在我的Web应用程序的其他地方,我使用以下代码将usercontrol的实例添加到页面:

divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails }));   

我正在使用LoadControl的重载版本,因为我想将Message参数传递给构造函数.这一切看起来都可行.

但是,当在OnPreRender()ErrorDisplay用户控件上触发时,lblTitle和lblDescription变量都是null,尽管它们具有等效的标记.消息变量已正确填充.

任何人都可以解释为什么会发生这种情况?

谢谢

编辑:

为了清楚起见,我还要补充说,以编程方式将用户控件添加到页面的代码正在响应按下按钮而运行,因此"托管页面"已经通过Init,Page_Load进行,现在正在处理事件处理程序.

我无法在早期的asp生命周期阶段添加usercontrol,因为它们是为响应按钮单击事件而创建的.



1> Ash..:

我也尝试了以下代码 - 产生相同的结果(即lblTitle和lblDescription都为null)

protected void Page_Load(object sender, EventArgs e)
{
    if (_ErrorMessage != null)
    {
        lblTitle.Text = _ErrorMessage.Message;
        lblDescription.Text = _ErrorMessage.Description;
    }
}

我理解LoadControl函数将它加载的控件加载到它所包含的页面的当前"状态".因此,Init,Page_Load等都作为LoadControl调用的一部分运行.

有趣的是,这个(未答复的)asp.net论坛帖子展示了与我遇到的相同的问题.

MSDN论坛帖子

另外 - 来自MSDN:

当您将控件加载到容器控件中时,容器会引发所有添加的控件的事件,直到它赶上当前事件.但是,添加的控件无法跟上回发数据处理.对于参与回发数据处理(包括验证)的附加控件,必须在Init事件中而不是在Load事件中添加控件.

因此,不应该正确控制LoadControl正确启动?

编辑:

好的,所以我在这里回答我自己的问题..

我发现这个论坛后我联系到上面的回答版本这里

基本上答案是,LoadControl( type, params )无法推断"页面前面"ascx要解析,因此它不会打扰任何控件的初始化.当您使用该LoadControl( "ascx path" )版本时,它会被赋予页面前面,因此会进行所有解析和初始化.

总而言之,我需要更改控件的初始化代码并将其拆分为单独的部分.即

Control ErrorCntrl = LoadControl("ErrorDisplay.ascx");
ErrorCntrl.ID = SomeID;
(ErrorCntrl as ErrorDisplay).SetErrorMessage = MessageDetail;
divErrorContainer.Controls.Add(ErrorCntrl);

它应该工作正常..它不像我以前的尝试那样整洁,但至少它会起作用.

我仍然愿意提出改进上述建议的建议.

干杯


+1和我感谢你解决我遇到的问题.:)
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有