首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

动态加载用户控件后,事件丢失有关问题

2012-02-22 
动态加载用户控件后,事件丢失问题我做了个LOGIN的用户控件,然后动态加载,但点了LOGINbutton后,有时候不能

动态加载用户控件后,事件丢失问题
我做了个LOGIN的用户控件,然后动态加载,但点了LOGIN   button后,有时候不能触发事件,有时候能。

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

        private   void   AddControl()
        {
        Control   userControl1   =   (Control)Page.LoadControl( "~/UserControls/WarningMessage.ascx ");
                userControl1.ID= "Warning ";
                Control   userControl2   =   (Control)Page.LoadControl( "~/UserControls/LogIn.ascx ");
                userControl2.ID= "Login ";

                if   (Context.User.Identity.IsAuthenticated)
                        PlaceHolder1.Controls.Add(userControl1);
                else
                        PlaceHolder1.Controls.Add(userControl2);
             
        }

        protected   void   Page_Init(object   sender,   EventArgs   s)
        {
               
        }

}
请高人指点

[解决办法]
你的控制逻辑不对。自己分析一下差别吧,大致应该是:

protected void Page_Load(object sender, EventArgs e)
{
AddControl();
}

private string _cn;

private void AddControl()
{
PlaceHolder1.Controls.Clear();
_cn=(string)ViewState[ "cn "];
if(_cn==null)
_cn= "~/UserControls/LogIn.ascx ";
Control userControl1 = (Control)Page.LoadControl(cn);
userControl1.ID= "WarningOrLogin ";
PlaceHolder1.Controls.Add(userControl1);
}

protected void Page_PreRender(object sender, EventArgs e)
{
string cn;
if (Context.User.Identity.IsAuthenticated)
cn= "~/UserControls/WarningMessage.ascx ";
else
cn= "~/UserControls/LogIn.ascx ";
if(_cn!=cn)
{
_cn=cn;
AddControl();
}
}


许多给入门者写的简单“示例”程序都似乎给人印象是page_load用来处理业务逻辑。其实这仅仅对特别简单、无动态交互的程序适用。那些特别简单的程序,你会发现把page_load中的东西放到page_prerender中其实也完全一样。

真正的对复杂程序(当然也就对简单程序)是“正招”的理念是:page_load应该用来让页面恢复上一次输出html时的控件树架构,而业务处理(例如响应某个事件立刻装入新控件)应该放在之后的事件中处理,例如在page_PreRender中。

对于动态装载的控件,往往你会看到有两个地方需要有代码执行装载工作。上面对page_load和后边的事件处理过程的区分其实已经说了原因。
[解决办法]
try:

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

AddControl();


}

private void AddControl()
{
// 注意下面强制转化为对应的控件,不要转为Control
WarningMessage userControl1 = (WarningMessage)Page.LoadControl( "~/UserControls/WarningMessage.ascx ");
userControl1.ID= "Warning ";
LogIn userControl2 = (LogIn)Page.LoadControl( "~/UserControls/LogIn.ascx ");
userControl2.ID= "Login ";

if (Context.User.Identity.IsAuthenticated)
PlaceHolder1.Controls.Add(userControl1);
else
PlaceHolder1.Controls.Add(userControl2);

}

热点排行