Ленивая загрузка вкладок с пользовательскими элементами управления

Я хочу использовать отложенную загрузку вкладок в контейнере вкладок 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;
        }
    }
 Rango07 июн. 2012 г., 13:45
Лучший учебник о том, как лениво загружать панели вкладок ajax:mattberseth.com/blog/2007/07/…
 user150907 июн. 2012 г., 14:20
@TimSchmelter Я уже попробовал это. Это не решает мою проблему.

Ответы на вопрос(1)

Решение Вопроса

Вам нужно воссоздавать динамически созданные элементы управления на каждой обратной передаче вPage_Load самое позднее, с тем же идентификатором, что и раньше. Таким образом, вы можете загрузить и добавить их в свои панели вActiveTabChanged, но вам нужно воссоздать их в следующем постбэке вPage_Init/Page_Load, Для этого нужно где-то хранить то, что воссоздать (например, вSession).

Но я предполагаю, что вы делаете вещи более сложными, чем необходимо, вы можете просто создать эти пользовательские элементы управления даже декларативно (в aspx) с начальнымVisible состояниеfalse, Тогда вам нужно только переключать видимость элементов управления по мере необходимости вActiveTabChanged.

Note: невидимые серверные веб-элементы управления вообще не будут отображаться клиентуViewState будут сохранены Так что нет недостатка в их объявлении.

Lazy-Load это не означает, что вы создаете эти элементы управления как можно позже, но это означает, что вы связываете их как можно позже. Поэтому никогда не связывайте их с базой данных изpage_load (например, в UserControl), но только из методов, которые будут вызываться при необходимости со страницы (здесь изActiveTabChanged). Для этого вы можете реализовать публичный методBindData в вашем UserControlUC1.

Вот простой пример:

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:

http://mattberseth.com/blog/2007/07/how_to_lazyload_tabpanels_with.html
 user150907 июн. 2012 г., 15:25
Да. Это заставит меня лучше понять.
 user150908 июн. 2012 г., 07:33
Большое спасибо. Вы решили мою большую проблему.
 07 июн. 2012 г., 15:14
@ coder311: это то, что я имел в виду:"....never bind them to the database from page_load...." Сделайте их видимыми и привязывайте их из ActiveTabChanged, а не из page_load. Они не должны загружаться автоматически, но только вручную, когда это необходимо. Должен ли я предоставить образецpublic void DataBind метод?
 07 июн. 2012 г., 19:25
@ coder311: Вы видели мое редактирование, это помогает?
 user150907 июн. 2012 г., 15:01
Если я вижу false, то вкладки также загружаются. Пользовательские элементы управления загружены. Я не хочу, чтобы они загружались во время загрузки страницы, потому что это замедляет скорость загрузки моей страницы. Я делаю это, чтобы улучшить скорость загрузки моей страницы.

Ваш ответ на вопрос