Se tivermos em uma página uma quantidade muito grande de abas, o HTML final vai ser igual a soma do HTML de todas as abas, certo? Sabendo disso, lhes pergunto: Já pensou como é pesado trazer para o usuário uma quantidade enorme de HTML (todas as abas) se o que ele quer inicialmente é apenas manipular o conteúdo de uma ou outra aba, mas não todas, ou seja, trazemos uma página muito pesada desnecessariamente.
Seria bem melhor se inicialmente carregassemos apenas a primeira aba, e caso fosse necessário, as outras abas seriam carregadas sobre demanda. Concordam?
Pois é!!! A intenção deste post é justamente isto. Mostrar como carregar abas sobre demanda em ASP.NET AJAX.
1. Como funciona?
A idéia é bastante simples.
- Colocaremos um Update Panel dentro de cada aba.
- Todos os controles que estam dentro de abas que não são a ativa, serão setados para VISIBLE = FALSE (Isso é necessário para não retornamos para o lado cliente todos os controles de todas as abas).
- A medida que o usuário muda de aba, será disparado um evento que será manipulado em javascript
- Este por sua vez irá disparar um UpdatePanel que irá atualizar os controles internos para VISIBLE = TRUE.
2. O Código HTML
1: <cc1:TabContainer ID="tbTesteBlog" runat="server" ActiveTabIndex="0" OnClientActiveTabChanged="mudancaAba">2: <cc1:TabPanel ID="TabPanel1" runat="server" HeaderText="TabPanel1">3: <HeaderTemplate>4: Aba 15: HeaderTemplate>6: <ContentTemplate>7: Aba 18: ContentTemplate>9: cc1:TabPanel>10: <cc1:TabPanel ID="TabPanel2" runat="server" HeaderText="TabPanel2">11: <HeaderTemplate>12: Aba 213: HeaderTemplate>14: <ContentTemplate>15: <asp:UpdatePanel ID="upAba2" runat="server">16: <ContentTemplate>17: <asp:Button ID="btnDisparaAba2" runat="server" Style="display: none" OnClick="btnDisparaAba2_Click" />18: <asp:Panel ID="pnlAba2" runat="server" Visible="false">19: Aba 220: asp:Panel>21: ContentTemplate>22: asp:UpdatePanel>23: ContentTemplate>24: cc1:TabPanel>25: <cc1:TabPanel ID="TabPanel3" runat="server" HeaderText="TabPanel3">26: <HeaderTemplate>27: Aba 328: HeaderTemplate>29: <ContentTemplate>30: <asp:UpdatePanel ID="upAba3" runat="server">31: <ContentTemplate>32: <asp:Button ID="btnDisparaAba3" runat="server" Style="display: none" OnClick="btnDisparaAba3_Click" />33: <asp:Panel ID="pnlAba3" runat="server" Visible="false">34: Aba 335: asp:Panel>36: ContentTemplate>37: asp:UpdatePanel>38: ContentTemplate>39: cc1:TabPanel>40: <cc1:TabPanel ID="TabPanel4" runat="server" HeaderText="TabPanel4">41: <HeaderTemplate>42: Aba 443: HeaderTemplate>44: <ContentTemplate>45: <asp:UpdatePanel ID="upAba4" runat="server">46: <ContentTemplate>47: <asp:Button ID="btnDisparaAba4" runat="server" Style="display: none" OnClick="btnDisparaAba4_Click" />48: <asp:Panel ID="pnlAba4" runat="server" Visible="false">49: Aba 450: asp:Panel>51: ContentTemplate>52: asp:UpdatePanel>53: ContentTemplate>54: cc1:TabPanel>55: cc1:TabContainer>
Explicações:
- Temos botões invisíveis (style=”display:none”) dentro de cada Update Panel, porque iremos manipular seus eventos de click para alterar a visibilidade do conteúdo para true.
- O evento do TabContainer que manipula a troca de abas é: OnClientActiveTabChanged
3. Código JavaScript
1: function mudancaAba() {2: var index = $find("<%= tbTesteBlog.ClientID %>").get_activeTabIndex();3: if (index == 1 && !$get("<%= pnlAba2.ClientID %>")) {4: $get("<%= btnDisparaAba2.ClientID %>").click();5: } else if (index == 2 && !$get("<%= pnlAba3.ClientID %>")) {6: $get("<%= btnDisparaAba3.ClientID %>").click();7: } else if (index == 3 && !$get("<%= pnlAba4.ClientID %>")) {8: $get("<%= btnDisparaAba4.ClientID %>").click();9: }10: }
Explicações:
- Na linha dois, eu pego o índice da aba selecionada
- Em seguida, saio comparado se a aba selecionada é a primeira ou a segunda ou a terceira…
- Verifico no “if”, também, se o panel já foi carregado. Se foi, não preciso carregar novamente.
- Caso contrario, forço o evento de click do respectivo botão.
3. O Código C#
Para finalizar, devemos manipular os eventos que serão disparados por nossos controles servidor ("btnDisparaAba3_Click", "btnDisparaAba2_Click", etc).Nesses eventos iremos setar nossos Panels para "visible = true". Apenas Isto!!! Simples não é?
public void btnDisparaAba3_Click(object sender, EventArgs e){
pnlAba3.Visible = true;
}
Para baixar o código fonte, acessar:
http://cid-2d6d3503299ba131.skydrive.live.com/self.aspx/Artigos/AbasPorDemanda.rar