我的asp.net网页上有一个RadMultipage控件。
我正在将用户控件加载为该控件内的页面。
下面是加载用户控件的代码。
protected void RadMultiPage1_PageViewCreated(object sender, Telerik.Web.UI.RadMultiPageEventArgs e)
{
try
{
string controlName;
int index = e.PageView.ID.Trim().IndexOf(" ");
if (index > 0)
{ controlName = e.PageView.ID.Trim().Remove(index); }
else
{ controlName = e.PageView.ID; }
Control pageViewContents = LoadControl(controlName + ".ascx");
pageViewContents.ID = e.PageView.ID + "userControl";
e.PageView.Controls.Add(pageViewContents);
}
catch (Exception ex)
{
Utility.WalkException(this, ex, "There was an error while performing this operation.");
}
}
我还启用了视图状态和autoeventwireup。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" EnableViewState="true" ViewStateMode="Enabled" Inherits="VentureAssessmentApp.Default" %>
现在我遇到的问题是用户控件上的按钮。该按钮的click事件不会被触发。它只是重新加载页面。甚至IsPostBack返回false。
有人可以提出一些解决方案吗?有时候,单击事件有效,但大多数情况下却无效。
最佳答案
这是一个典型的页面生命周期问题。我猜发生了什么事,就是当触发回发时,页面不知道哪个控件触发了回发,因为在进行评估时,尚未将Button(及其父UserControl)添加到页面的控件层次结构中...所以,我将矛头指向RadMultiPage1_PageViewCreated
事件处理程序。在我看来,将服务器控件动态添加到页面很尴尬。
建议
将控件加载逻辑移出RadMultiPage1_PageViewCreated
事件。将此逻辑放在Page的Init
事件中,或者如果Load
事件为时过早,将其放在页面的Init
事件中。
您可以通过检查RadMultiPage
属性或SelectedIndex
属性来确定在SelectedPageView
控件中选择了哪个页面。但是,如果将RadTabStrip
控件与RadMultiPage
控件结合使用,则可以检查RadTabStrip
的SelectedTab
或SelectedIndex
属性
例
protected override void OnLoad(EventArgs e)
{
LoadStuff();
}
private void LoadStuff()
{
try
{
string controlName;
int index = YOUR_MULTI_PAGE_CONTROL.SelectedIndex;
if (index > 0)
{ controlName = YOUR_MULTI_PAGE_CONTROL.PageViews[index].ID.Trim().Remove(index); }
else
{ controlName = YOUR_MULTI_PAGE_CONTROL.PageViews[index].ID; }
Control pageViewContents = LoadControl(controlName + ".ascx");
pageViewContents.ID = YOUR_MULTI_PAGE_CONTROL.PageViews[index].ID + "userControl";
YOUR_MULTI_PAGE_CONTROL.PageView.Controls.Add(pageViewContents);
}
catch (Exception ex)
{
Utility.WalkException(this, ex, "There was an error while performing this operation.");
}
}