2011-12-20 66 views
0

我有一个带有按钮的ASP.NET用户控件,并且当用户单击另一个用户控件的按钮时,我想将它添加到页面中。我为第一个用户控件创建了一个事件处理程序,以便从页面处理它并将第二个用户控件添加到页面中。一切正常,但第二个用户控件上的按钮不响应该事件。在运行时加载ASP.NET用户控件

我放在RadAjaxPanel

注二等控制:当我在设计时添加第二个用户控制其工作的罚款。

+1

你可以发表一些代码吗? – Strillo 2011-12-20 12:51:30

+2

你能告诉我们你正在使用的代码吗? – 2011-12-20 12:51:36

+0

你需要什么样的代码? – 2011-12-20 12:59:30

回答

3

所有动态创建的控件都应该添加到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(); 
} 
} 

这样做的再装填在生命周期上即时当事件发生第一次,然后在未来的时间控制的效果。

+0

我明白你的意思,我需要这样的东西 http://demos.telerik.com/aspnet-ajax/ajax/examples/common/loadingusercontrols/ defaultcs.aspx – 2011-12-20 13:06:31

+0

您可能非常接近 - 只需在ViewState中设置一些标记,即需要加载该控件,然后在ViewState标志设置为true时将其加载到Page_Load中。 – bgs264 2011-12-20 13:20:30

+0

非常感谢! +1!这帮了我很多! – Mike 2012-09-07 06:35:07