使用用户控件的延迟加载选项卡

我想在AJAX选项卡容器中使用延迟加载选项卡。 我已经实现了它。 但是我遇到的问题是,当我点击一个按钮或触发该用户控件中的任何事件时,它不会被触发; 什么都没发生。

                    

代码隐藏:

  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; } } 

您需要最迟在Page_Load中的每个回发上重新创建动态创建的控件,并使用与以前相同的ID。 因此,您可以在ActiveTabChanged加载并将它们添加到面板中,但是您需要在Page_Init/Page_Load的下一个回发中重新创建它们。 因此,您需要存储重新创建的内容( Session fe)。

但是我假设你做的事情比必要的更复杂,你甚至可以简单地创建这些UserControls(在aspx上),初始Visible状态为false 。 然后,您只需要在ActiveTabChanged根据需要切换控件的可见性。

注意 :不会向客户端呈现不可见的服务器端web ViewState也不会保存任何ViewState 。 所以声明它们没有任何不利之处。

延迟加载并不意味着您尽可能晚地创建这些控件,但这意味着您尽可能晚地对它们进行数据绑定。 所以永远不要将它们从page_load (在UserControl中的fe)绑定到数据库,而只从必要时从页面调用的方法(此处来自ActiveTabChanged )。 因此,您可以在UserControl UC1实现公共方法BindData

这是一个简单的例子:

 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的最佳教程: