日期:2014-05-18  浏览次数:20424 次

动态加载用户控件后,事件丢失问题
我做了个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