我有一个带有按钮的ASP.NET用户控件,我想在用户单击另一个用户控件的按钮时将其添加到页面中。我已经为第一个用户控件创建了一个事件处理程序,以便从页面处理它并将第二个用户控件添加到页面中。一切正常,但第二个用户控件上的按钮不响应事件。
我将第二个控件放在RadAjaxPanel
注意:当我在设计时添加第二个用户控件时,它的工作正常。
答案 0 :(得分:3)
所有动态创建的控件都应该在Page_Init的末尾添加(尽管有时你可以在Page_Load的末尾添加它们)。
如果您只是根据按钮点击事件添加它们,那么您已经在生命周期中触发Page_Init和Page_Load之后的事件处理中执行了此操作 - 这就是为什么您的事件不会触发以及为什么它可以正常工作当你在设计时添加。
这是因为当在第二个用户控件上单击按钮时 - 整个页面生命周期再次开始。页面首先通过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();
}
}
这样可以在事件首次发生时即时加载控件,然后在生命周期的未来时间加载。