2

我想在 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;
        }
    }
4

1 回答 1

4

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

但我假设你让事情变得比必要的更复杂,你可以简单地创建这些用户控件,甚至以声明方式(在 aspx 上)初始Visible状态为false. 然后,您只需要根据需要在 中切换控件的可见性ActiveTabChanged

注意:不可见的服务器端 web 控件根本不会呈现给客户端,也ViewState不会被保存。因此,声明它们没有任何缺点。

延迟加载并不意味着您尽可能晚地创建这些控件,而是意味着您尽可能晚地对它们进行数据绑定。所以永远不要将它们从(在 UserControl 中的 fe)绑定到数据库page_load,而只能从在必要时从页面调用的方法(这里从ActiveTabChanged)绑定到数据库。BindData因此,您可以在 UserControl 中实现公共方法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 的最佳教程:

于 2012-06-07T11:58:08.277 回答