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