我想在AJAX选项卡容器中使用延迟加载选项卡。我已经实现了它。但我遇到的问题是,当我点击一个按钮或触发该用户控件中的任何事件时,它不会被触发;什么都没发生。
<asp:TabContainer runat="server" ID="TabContainerUp"
ActiveTabIndex="0" AutoPostBack="true" OnActiveTabChanged="TabContainerUp_ActiveTabChanged">
<asp:TabPanel ID="tab1" runat="server">
<HeaderTemplate>
<img src="images/uc1.png" alt="" />
</HeaderTemplate>
<ContentTemplate>
<asp:Panel ID="pnlUC1" runat="server">
</asp:Panel>
</ContentTemplate>
</asp:TabPanel>
<asp:TabPanel ID="tab2" runat="server">
<HeaderTemplate>
<img src="images/uc2.png" alt="" />
</HeaderTemplate>
<ContentTemplate>
<asp:Panel ID="pnlUC2" runat="server">
</asp:Panel>
</ContentTemplate>
</asp:TabPanel>
</asp:TabContainer>
代码隐藏:
protected void TabContainerUp_ActiveTabChanged(object sender, EventArgs e)
{
string tabName = TabContainerUp.ActiveTab.ID;
getActiveTab(tabName);
}
public void getActiveTab(string tabName)
{
UserControl uc;
//uc.
switch (tabName)
{
case "tab1":
pnlUC1.Controls.Clear();
uc = Page.LoadControl("~/Controls/UC1.ascx") as UserControl;
pnlUC1.Controls.Add(uc);
break;
case "tab2":
pnlUC2.Controls.Clear();
uc = Page.LoadControl("~/Controls/UC1.ascx") as UserControl;
pnlUC2.Controls.Add(uc);
break;
}
}
答案 0 :(得分:4)
您最迟需要在Page_Load
中的每个回发上重新创建动态创建的控件,其ID与之前相同。因此,您可以在ActiveTabChanged
中加载并将它们添加到面板中,但您需要在Page_Init/Page_Load
的下一个回发中重新创建它们。因此,您需要存储重新创建的内容(例如Session
)。
但是我认为你做的事情比必要的更复杂,你可以简单地创建这些UserControl甚至以Visible
的初始false
状态声明性地(在aspx上)。然后,您只需要在ActiveTabChanged
中切换控件的可见性。
注意:不会向客户端呈现不可见的服务器端webcontrols,并且不会保存ViewState
。因此宣布它们没有任何不利之处。
延迟加载 并不意味着您尽可能晚地创建这些控件,但这意味着您尽可能晚地对它们进行数据绑定。所以永远不要将它们从page_load
(在UserControl中的f.e。)绑定到数据库,而只是从必要时从页面调用的方法(此处来自ActiveTabChanged
)。因此,您可以在UserControl BindData
中实现公共方法UC1
。
这是一个简单的例子:
switch (tabName)
{
case "tab1":
UC1_1.Visible = true;
UC1_1.BindData();
UC1_2.Visible = false;
break;
case "tab2":
UC1_1.Visible = false;
UC1_2.Visible = true;
UC1_2.BindData();
break;
}
并在UserControl
public void BindData()
{
// put here all your databinding stuff
// that is in page_load now ...
}
这可能是关于延迟加载ajax TabPanels的最佳教程: