我有一个带有按钮的ASP.NET用户控件,并且当用户单击另一个用户控件的按钮时,我想将它添加到页面中。我为第一个用户控件创建了一个事件处理程序,以便从页面处理它并将第二个用户控件添加到页面中。一切正常,但第二个用户控件上的按钮不响应该事件。在运行时加载ASP.NET用户控件
我放在RadAjaxPanel
注二等控制:当我在设计时添加第二个用户控制其工作的罚款。
我有一个带有按钮的ASP.NET用户控件,并且当用户单击另一个用户控件的按钮时,我想将它添加到页面中。我为第一个用户控件创建了一个事件处理程序,以便从页面处理它并将第二个用户控件添加到页面中。一切正常,但第二个用户控件上的按钮不响应该事件。在运行时加载ASP.NET用户控件
我放在RadAjaxPanel
注二等控制:当我在设计时添加第二个用户控制其工作的罚款。
所有动态创建的控件都应该添加到Page_Init的最后(尽管有时你可以在Page_Load的最后添加它们)。
如果你只是基于按钮点击事件添加它们,那么你已经在生命周期中的Page_Init和Page_Load之后触发的事件handers中完成了这一点 - 这就是为什么你的事件不会触发以及它为什么起作用很好,当你在设计时添加。
这是因为当在第二个用户控件上单击一个按钮时 - 整个页面生命周期再次开始。该页面首先通过Page_Load和Page_Init,并且您的控件不会在此处加载。所以,当页面生命周期处理“处理回发事件”部分时,控件不再实际存在,所以事件不会触发。相反,当您在设计时添加控件时,该控件存在于Page_Init和Page_Load中,因此它能够处理来自用户控件的回发事件,因为它已经存在于控件树中 - 如果这是有意义的。
您需要考虑如何重组,以便在Page_Load最迟完成时添加它们,否则它将无法工作。如果没有代码示例或更多细节,很难确切地建议你如何做到这一点。一种可能性是将其设置为可见而不是直接加载 - 但是如果控件在加载数据库命中或API调用时做了一些“繁重工作”,那么这可能不适合您。
我做了类似的事情。我所做的是根据DropDownList
中的选择动态加载一些控件。如果您有加载控制你的方法,让我们把它LoadControls()
,那么你可以做这样的事情:
DropDownList_Click {
ViewState("LoadControls") = true;
LoadControls()
}
通过设置ViewState的变量,则可以显示的Page_Load加载未来的回发的控件:
Page_Load {
if (ViewState("LoadControls") == "true")
{
LoadControls();
}
}
这样做的再装填在生命周期上即时当事件发生第一次,然后在未来的时间控制的效果。
你可以发表一些代码吗? – Strillo 2011-12-20 12:51:30
你能告诉我们你正在使用的代码吗? – 2011-12-20 12:51:36
你需要什么样的代码? – 2011-12-20 12:59:30