Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«
intcontpiada : 118
Guilherme Tell
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 





Por Dennes Torres
dennes@bufaloinfo.com.br
Dennes Torres possui as certificações MCAD, MCSD,MCSE, MCDBA e MCT. Atualmente atua Como diretor da Búfalo Informática, líder do grupo de usuários DevASPNet no Rio de Janeiro e membro da liderança dos grupos getWindows e devSQL, também do Rio de Janeiro, podendo sempre ser encontrado na lista de discussão do grupo DevASPNet (devaspnet-subscribe@yahoogrupos.com.br) bem como nas reuniões do grupo. Mantém dois blogs em http://cidadaocarioca.blogspot.com

Usando (e abusando) com TabContainer e TabPanel

Pesquisa personalizada
Pesquisar Dicas:






Vamos neste artigo começar a falar dos principais controles do Ajax Control Toolkit, aqueles que você deve separar e fazer questão de utilizar em sua aplicação. É claro que é impossível falarmos de todos os controles em um único artigo, então este artigo será dividido em várias partes.

Inicialmente pensei em falar sobre vários controles neste primeiro artigo. Poré o TabContainer e TabPanel se mostraram com uma complexidade suficiente para merecerem um artigo só para eles.

Escrevi boa parte deste artigo antes do lançamento da versão de 6 de Junho do AjaxControlToolkit. Assim sendo, ocorreram algumas mudanças entre a versão de 6 de junho e a anterior. Recomendo que atualize para a versão de 6 de junho, mas se por algum motivo precisar utilizar a anterior, fica aqui documentado o funcionamento.

Trata-se de um controle para possibilitar o uso de múltiplas tabs dentro de uma aplicação web, o que é uma operação muito comum na montagem de interfaces gráficas.

O tabContainer contém TabPanels, pode conter diversos TabPanels. O grande pecado deste controle é não fornecer um designer para a edição dos TabPanels. Não é possível nem ao menos visualizar os tabPanels em design time.

A grande correção lançada na versão de 6 de junho é justamente possuir um designer para a criação das tabs. Ainda assim, a dica abaixo continua sendo válida por motivos de design e separação de código.

A forma de contornar esse problema (que seria um grande problema de manutenção), porém, é bem simples : Basta que seja desenvolvido um user control para cada tabPanel. Desta forma conseguimos dar manutenção em cada tabPanel alterando o conteúdo do user control, permitindo assim uma fácil montagem da interface gráfica. Mas o criador destes componentes fica nos devendo essa.

No VS 2005 precisamos de um pouco de copy/past para resolver o problema. Primeiramente arrastamos os user controls para dentro da página, fora dos tabPanels. Isso gera a tag @Register e a tag do usercontrol. Pelo HTML, precisamos recortar e colar a tag do user control para dentro do contentTemplate de cada tabPanel. Isso acontece porque arrastar um usercontrol do solution explorer para o HTML, no VS 2005, não gera a inserção e registro do user control. Esperamos que isso mude no aguardado VS 2007, ainda esse ano.

Não foi necessário aguardar : na versão de 6 de Junho arrastar user controls para dentro das tabs funciona perfeitamente. Mas as tabs ainda não conseguem renderizar os user controls por inteiro, por exemplo, se houver um updatePanel no usercontrol . Mas tudo bem, já melhorou bastante.

Caso você resolva não seguir essa dica e se aventurar a fazer tudo em HTML mesmo, então vai outra dica : Não insira datasources direto nos tabPanels. Os gridviews ou outros objetos dataBound se perdem com isso.

Mais um problema resolvido : os datasources dentro de tabs funcionam bem agora. Porém as tabs não são mais containers isolados, como um template de gridview, por exemplo. O VS irá reclamar até mesmo se você usar o mesmo nome de objeto em 2 diferentes tabs, o que não teria importância em um template de gridview.

Vamos começar a fazer um exemplo e depois partir para tarefas mais avançadas.

1) Crie um novo projeto web utilizando o template do AjaxControlToolkit (como pode ver na imagem abaixo, o ícone do template não espelha a linguagem em que o site será criado)

2) Crie 5 web user controls chamados Tab1, Tab2 ... Tab5

3) Em cada user control digite "Este é o tab ..." e insira um botão

4) Na página default.aspx insira um tabContainer

A principio o tabContainer, assim como outros controles do Ajax Toolkit, estarão na sua Toolbox. Porém, caso não estejam, faça o seguinte :

A) Clique com o botão direito na toolbox e selecione "Add Tab"

B) Dê o nome de "Ajax Control Toolkit"

C) Na nova tab, clique com o botão direito e selecione "Choose items"

D) Na tela que é exibida, clique no botão browse e aponte para a dll do ajaxcontrolToolkit que encontra-se no diretório Bin de seu próprio site - recém criado

5) Entre em modo HTML

6) Dentro do tabContainer, abra uma tag (<) e o intellisense mostrará que você pode inserir tabPanels dentro do tabContainer. Insira 4 TabPanels, inserindo os ids como tab1, tab2 ... tab4 e utilizando o runtat=server em cada um

 <ajaxToolkit:TabContainer ID="TabContainer1" runat="server">
     <ajaxToolkit:TabPanel ID="tab1" runat="server">
     </ajaxToolkit:TabPanel>
     <ajaxToolkit:TabPanel ID="tab2" runat="server">
     </ajaxToolkit:TabPanel>
     <ajaxToolkit:TabPanel ID="tab3" runat="server">
     </ajaxToolkit:TabPanel>
     <ajaxToolkit:TabPanel ID="tab4" runat="server">
     </ajaxToolkit:TabPanel>
 </ajaxToolkit:TabContainer>

7) Dentro do primeiro TabPanel, abra uma tag (<) e o intelissense irá mostrar a você que você possui um headerTemplate e um contentTemplate para preencher. Fica bem claro que trata-se do header da tab e do conteúdo da tab.

8) Gere um headertemplate e contenttemplate para cada um dos tabPanels, ambos vazios por enquanto

            <ajaxToolkit:TabContainer ID="TabContainer1" runat="server">
<ajaxToolkit:TabPanel ID="Tab1" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="Tab2" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="Tab3" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="Tab4" runat="server">
<HeaderTemplate>
</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
</ajaxToolkit:TabContainer>

9) Preencha o headertemplate com o nome da tab (tab1, tab2,...tab4)

            <ajaxToolkit:TabContainer ID="TabContainer1" runat="server">
<ajaxToolkit:TabPanel ID="Tab1" runat="server">
<HeaderTemplate>
Tab1
</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="Tab2" runat="server">
<HeaderTemplate>
Tab2</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="Tab3" runat="server">
<HeaderTemplate>
Tab3</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="Tab4" runat="server">
<HeaderTemplate>
Tab 4</HeaderTemplate>
<ContentTemplate>
</ContentTemplate>
</ajaxToolkit:TabPanel>
</ajaxToolkit:TabContainer>

10) Volte ao modo design

11) Arraste os 4 primeiros user controls tab para dentro da página (fora do tabContainer, nem teria como ser diferente)

12) Entre no modo HTML.

14) Mova a tag de cada user control para dentro de sua respectiva tab

             <ajaxToolkit:TabContainer ID="TabContainer1" runat="server">
<ajaxToolkit:TabPanel ID="tab1" runat="server">
<HeaderTemplate>
Tab1
</HeaderTemplate>
<ContentTemplate>
<uc1:tab1 id="Tab1_1" runat="server" />
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="tab2" runat="server">
<HeaderTemplate>
Tab2</HeaderTemplate>
<ContentTemplate>
<uc2:tab2 id="Tab2_1" runat="server" />
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="tab3" runat="server">
<HeaderTemplate>
Tab3</HeaderTemplate>
<ContentTemplate>
<uc3:tab3 id="Tab3_1" runat="server" />
</ContentTemplate>
</ajaxToolkit:TabPanel>
<ajaxToolkit:TabPanel ID="tab4" runat="server">
<HeaderTemplate>
Tab 4</HeaderTemplate>
<ContentTemplate>
<uc4:tab4 id="Tab4_1" runat="server" />
</ContentTemplate>
</ajaxToolkit:TabPanel>
</ajaxToolkit:TabContainer>

15) Teste a aplicação, rodando a página default.aspx

 

O que deve ser observado :

- As mudanças de Tab acontecem sem que haja um postback, o que é bom

- Os botões dos user controls causam postback, mas o tabcontainer não se perde com relação a tab ativa.

Experiências avançadas com o postback

1) Insira um datasource no tab3.ascx apontando para a tabela products do banco northwind (pegue os campos productid,productname,unitprice,unitsinstock).

2) Insira uma gridview no tab3.ascx e interligue com este datasource. Faça um autoformat e habilite a paginação.

3) Insira um datasource no tab2.ascx apontando para a tabela customers do banco northwind(pegue os campos customerid,companyname,contactname e country).

4) Insira uma gridview no tab2.ascx e interligue com este datasource. Faça um autoformat e habilite a paginação.

 

5) Teste a aplicação.


O que deve ser observado :

- Sempre que paginamos qualquer uma das gridViews o tabContainer perde o indice da tab em que se encontrava, voltando para a primeira tab

Isso não acontece mais tão diretamente na nova versão. Ainda assim, quando inseri duas gridview, uma em cada tab, também houve perda do índice da tab atual. Então ainda existe uma perda e as dicas que se seguirão continuam válidas

- Será que ele está sempre processando as duas gridviews ou apenas uma de cada vez, conforme necessário ?

Testando o processamento :

6) No tab3.ascx, no evento page_load do user control, insira o seguinte código :

    6         GridView1.DataBind()

Porque : A Gridview naturalmente evita a ida a banco quando nada mudou e disfarçaria o resultado de nosso teste. O objetivo é testar os tabs.

7) Abra o SQL Server Management Studio

8) No menu Tools, abra o SQL Profiler

9) Rode a aplicação

10) Pagine a gridview de produtos (tab2.ascx) várias vezes

11) Observe o resultado no sql server profiler


Resultado : A cada paginação, tanto a tabela de clientes como a tabela de produtos foram reprocessadas.

Conclusão : A cada postback o tabContainer reconstroi todas as tabs, fazendo o processamento de seus user controls. Na maioria das vezes isso não irá nos afetar, já que a própria gridView evita ir ao banco desnecessariamente e poderiamos também utilizar um updatePanel dentro dos user Controls, porém é importante ter esse conhecimento para que nossas codificações não rodem inesperadamente, causando transtornos.

Resolvendo o problema da perda da tab atual :

Solução : Utilize um updatePanel dentro dos usercontrols que possuem controles databound, isso resolve o problema

Esta solução se torna então uma regra a ser utilizada em user controls destinados a ficarem dentro de tabPanels


Fazendo uma Tab sumir

Pode ser necessário durante o desenvolvimento fazer com que uma tab desapareça do tabPanel. Vamos testar isso.

Vamos fazer com que o botão da tab3.ascx faça com que a tab4 desapareça. No click do botão, programe o seguinte :

   10         Dim tc As AjaxControlToolkit.TabContainer
   11         tc = Me.Page.FindControl("tabcontainer1")
   12         tc.Tabs(3).Visible = False

Teste a aplicação

Você verá que a Tab4 (o indice começa em 0) realmente desaparece, mas o seu título permanece visível. Como fazer com que o título da Tab4 também desapareça ?

Infelizmente isso é um bug dos tabPanels, eles deixam o conteúdo do seu header ser renderizado mesmo quando estão com visible false. A única forma de resolver isso é via javascript, veja a função a seguir :

     <script type="text/jscript">
function esconderheader()
{
elemento=document.getElementById("__tab_TabContainer1_tab4");
elemento.innerHTML="";
}
</script>

Esta função localiza o header do tab4 (o nome deve ser descoberto utilizando view source no browser, haverão diferenças se estiverem utilizando masterpages ou outros containers) e limpa seu conteúdo, fazendo com que o header do tab4 desapareça.

A questão é : onde chamar a função ?

Nosso pensamento lógico seria chamar a função também dentro do botão, logo após mudar o visible do tab3. Porém devemos lembrar o seguinte : Vários postbacks acontecerão durante o uso da página e desejaremos manter o estado da tab4 como oculta. Essa chamada da função esconderheader será perdida a cada postback que for realizado na página, então precisamos manter o estado de que a tab4 está oculta e registrar novamente o javascript sempre que este estado estiver como true.

Primeiramente a questão de manter o estado. Inserimos esta propriedade no tab3.ascx :

   15     Public Property registrar() As Boolean
   16         Get
   17             If IsNothing(ViewState("registrar")) Then
   18                 ViewState("registrar") = False
   19             End If
   20             Return (ViewState("registrar"))
   21         End Get
   22         Set(ByVal value As Boolean)
   23             ViewState("registrar") = value
   24         End Set
   25     End Property

Usei o nome Registrar indicando se o javascript de ocultação deve ou não ser registrado. Guardo a informação no viewstate de forma que possa ser recuperada em qualquer postback. Acrescentamos então uma linha a mais no click do botão :

   10         Dim tc As AjaxControlToolkit.TabContainer
   11         tc = Me.Page.FindControl("tabcontainer1")
   12         tc.Tabs(3).Visible = False
   13         registrar = True

 

Por fim, vamos programar o pré-render para gerar a chamada do javascript se o registrar estiver como true. Este código também ficará no tab3.ascx :

   28     Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
   29 
   30         If registrar Then
   31             Me.Page.ClientScript.RegisterStartupScript(Me.GetType, "xx", "esconderheader();", True)
   32 
   33         End If
   34     End Sub

Observe que utilizei o registerStartupScript e não o RegisterClientScriptBlock. Isso é muito importante neste caso. Se for utilizado o RegisterClientScriptBlock nosso javascript vai rodar antes do javascript do Ajax ter criado os elementos da página e consequentemente não teremos sucesso. Com o RegisterStartupScript nosso javascript vai poder rodar depois do javascript do Ajax, sendo bem sucedido.

Agora você pode testar a aplicação e verá que a tab4 realmente desaparece por completo. Você pode inclusive ir na tab1 e pressionar várias vezes o botão, causando postbacks, e verá que a tab4 se mantém oculta. A cada postback o javascript para esconder o header é registrado novamente.

Tornando a Tab4 visível novamente

Pode parecer uma tarefa trivial, mas para complicar as coisas, vamos fazer com que o botão responsável por isso seja o botão da Tab2.

Como a Tab3 controla toda a lógica para tornar a Tab4 invisivel (o registro do javascript) iremos precisar que a Tab2 se comunique com a Tab3, fazendo assim uma comunicação entre Tabs e, porque não dizer, entre user controls.

O controle Tab2 é que precisará estar acessando o controle Tab3, desta forma vamos criar no controle Tab2 uma propriedade que possa conter o Tab3, da seguinte forma :

    Dim uc As tab3
 
    Public Property controle() As Tab3
        Get
            Return (uc)
        End Get
        Set(ByVal value As Tab3)
            uc = value
        End Set
    End Property

Mas por que precisamos de uma propriedade ? Não podemos do Tab2 acessar diretamente o Tab3 ?

Tab2 poderia acessar diretamente o tab3 fazendo um findControl (na verdade um pouco mais complicado que isso) em me.Page . Porém ao fazer isso estariamos criando um alto ACOPLAMENTO entre ambos. O TAB2 apenas poderia estar presente em páginas que possuissem também o TAB3. A criação da propriedade, portanto, faz parte das técnicas da OO para evitar o ALTO ACOPLAMENTO entre os controles do site.

Em nosso exemplo, a página default.aspx irá fazer a ligação entre a Tab2 e a Tab3, passando o user control Tab3 para dentro da propriedade que criamos no Tab2.

Ocorre que ambos os userControls (tab2 e tab3) encontram-se "escondidos" dentro de vários containers (TabContainer, TabPanel), por isso eles nem são visíveis diretamente nem mesmo acessíveis pelo findcontrol (veja detalhes em http://www.bufaloinfo.com.br/dicas.asp?cod=810). Por isso vamos criar uma função especial para localizar os objetos nesta situação :

    Function acharcontrole(ByVal inicio As Control, ByVal achar As String) As Control
        Dim controle As Control
        controle = inicio.FindControl(achar)
        If Not IsNothing(controle) Then
            Return (controle)
        End If
        For Each uc As Control In inicio.Controls
            controle = acharcontrole(uc, achar)
            If Not IsNothing(controle) Then
                Return (controle)
            End If
        Next
        Return (Nothing)
    End Function

 

O page_load de nossa default.aspx vai então fazer uso desta função acharControle para localizar a instância de nossos 2 user controls :

    Dim uc As Tab2
    uc = acharcontrole(Me, "Tab2_1")
    uc.controle = acharcontrole(Me, "Tab3_1")

Localizamos o tab2 pelo nome de sua instância e passamos para sua propriedade controle a instância do Tab3 (que também localizamos pelo seu nome de instância).

Por fim, para trazermos o Tab4 de volta vamos programar o botão do Tab2.

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Not IsNothing(controle) Then
            Dim tc As AjaxControlToolkit.TabContainer
            tc = Page.FindControl("Tabcontainer1")
            tc.Tabs(3).Visible = True
            controle.registrar = False
        End If
    End Sub

No código do botão do tab2, tornamos o tab4 visivel novamente (através das propriedades do tabcontainer) e alteramos a propriedade registrar do Tab3 para que o tab3 pare de gerar o javascript a cada postback.

Podemos novamente testar a aplicação e já estará funcionando, com o tab3 escondendo o tab4 e o tab2 exibindo novamente o tab4.

Observe que fazemos o teste para garantir que a propriedade controle não está vazia. É apenas um exemplo, mas isso garante o baixo acoplamento, ou seja, podemos utilizar este user control em outras páginas mesmo sem a presença do controle Tab3.

Criar uma nova tab dinamicamente

Deixamos para a Tab5 a parte mais interessante, a criação dinâmica de uma nova Tab. Vamos fazer com que a Tab1 crie dinamicamente a Tab5, carregando o controle Tab5.ascx dentro da nova Tab.

Mais uma vez, nosso maior problema não é a criação da Tab5 em si, mas saber que a Tab5 foi criada e consequentemente mante-la através dos postbacks. Quando um objeto é criado dinamicamente, para que se mantenha através dos postback precisa ser recriado a cada postback.

No caso da criação dinâmica de tabs temos mais uma complicação : A Tab precisa ser criada durante o procedimento de Init da página. Se deixarmos para depois receberemos um erro do tabContainer devido a inconsistência no seu número de tabs.

Porém no INIT da página os userControls ainda não recuperaram seu ViewState. No exemplo anterior foi possível utilizarmos o viewstate para guardarmos a informação sobre a visibilidade da Tab4, mas desta fez não poderemos guardar a informação no viewstate, pois os usercontrols não terão recuperado seu viewstate ainda. Como resolver, então ?

A solução é utilizarmos os velhos métodos do ASP classico : um campo hidden.

Assim sendo criamos uma propriedade na Tab1 que guarde seu valor em um campo hidden. Veja como fica :

    Public Property TabRegistrada() As Boolean
        Get
            If IsNothing(Request.Form("tabregistrada")) Then
                Return (False)
            Else
                Return (Request.Form("tabregistrada"))
            End If
        End Get
        Set(ByVal value As Boolean)
            registrarhidden(value)
        End Set
    End Property

 

Isso segue a metodologia citada em http://www.bufaloinfo.com.br/dicas.asp?cod=713

O GET da propriedade lê o valor diretamente do requestForm, enquanto que o SET da propriedade chama a sub registrarHidden, para fazer a gravação do campo hidden com um determinado valor.

Veja como fica a Sub registrarHidden :

    Private Sub registrarhidden(ByVal valor As Boolean)
        Static registrou As Boolean
        Dim hi As New HtmlInputHidden
        If Not registrou Then
            hi.Name = "tabregistrada"
            hi.ID = "tabregistrada"
            Me.Page.Form.Controls.Add(hi)
            registrou = True
        Else
            hi = Page.Form.FindControl("tabregistrada")
        End If
        hi.Value = valor
    End Sub

A variável registrou é estática para não correr o risco de registrar o campo hidden mais de uma vez. Então verificamos se ele já foi registrado. Se não foi, criamos o campo, se já foi, fazemos um findcontrol por ele. Em qualquer caso, passamos o novo valor para o campo hidden.

A propriedade e a sub RegistrarHidden fazem o trabalho de identificar quando a Tab5 está ou não criada. Mas o que precisamos fazer agora é realmente realizar a criação da Tab5. Não é difícil, veja :

    Private Sub registrarTab()
        Dim tb As New AjaxControlToolkit.TabPanel
        Dim tc As AjaxControlToolkit.TabContainer
        tb.ContentTemplate = Me.LoadTemplate("tab5.ascx")
        tb.HeaderTemplate = Me.LoadTemplate("tab5header.ascx")
        tc = Me.Page.FindControl("Tabcontainer1")
        tc.Tabs.Add(tb)
        TabRegistrada = True
    End Sub

Criamos um novo tabPanel, carregamos o userControl que desejamos para dentro deste novo tabPanel. O header, no caso, também precisará ser um usercontrol, criado como tab5header.ascx e contendo apenas o titulo da tab("tab 5"). Por fim adicionamos o novo tabPanel no tabContainer e alteramos a propriedade TabRegistrada para true.

Neste ponto temos então a criação da tab e seu registro na forma de campo hidden. Fica faltando apenas que o botão da Tab1 dispare a criação da tab :

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Not TabRegistrada Then
            registrarTab()
        End If
    End Sub

Agora precisamos garantir que, em todos os postbacks, caso a tab5 já tenha sido criada ela será re-criada, mantendo-a no tabContainer. Para isso vamos programar diretamente na página :

    Public Sub iniciartab(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Init
        Dim uc As tab1
        uc = acharcontrole(Me, "Tab1_1")
        uc.registrar()
    End Sub

O método registrar (no tab1.ascx) faz apenas esta tarefa : registra a tab, se necessário, e refaz o campo hidden - pois este também precisa ser refeito em todos os postbacks.

    Public Sub registrar()
        If TabRegistrada Then
            registrarTab()
        End If
        registrarhidden(TabRegistrada)
    End Sub

Conclusão

Para algumas tarefas podemos ter algum trabalho extra, mas nem por isso o tabContainer e TabPanel deixam de ser controles extremamente úteis para o nosso dia-a-dia.

Além disso, indiretamente aproveitamos para ver algumas questões sobre acoplamento no desenvolvimento com user controls.

 

 



Envie seus comentários sobre este artigo

Nome :

E-mail :

Comentários :


Avise-me quando houverem novos comentários nesta página

Veja abaixo os comentários já enviados :

Nome : Edimar Ramos E-Mail : edimar_ramos@yahoo.com.br
Olá...
estou fazendo uns testes com o TabContainer, e estou tendo um probleminha, talvez voce saberia me ajudar... Estou tendo um probleminha com o uso de validation no TabContainer, na seguinte situação: ao criar um cadastro onde uso cada aba como um agrupamento de informações a ser cadastrada, e por exemplo, na segunda aba tem um campo onde tem um validation, se clico em salva quando estou em outra aba, o validaton é ativado, porem eu gostaria que o focus fosse para o campo que deve ser preenchido.
Sabe me dizer se tem alguma forma de fazer isso.??? Valeu!!!
Nome : Edimar Ramos E-Mail : edimar_ramos@yahoo.com.br
Olá...
estou fazendo uns testes com o TabContainer, e estou tendo um probleminha, talvez voce saberia me ajudar... Estou tendo um probleminha com o uso de validation no TabContainer, na seguinte situação: ao criar um cadastro onde uso cada aba como um agrupamento de informações a ser cadastrada, e por exemplo, na segunda aba tem um campo onde tem um validation, se clico em salva quando estou em outra aba, o validaton é ativado, porem eu gostaria que o focus fosse para o campo que deve ser preenchido.
Sabe me dizer se tem alguma forma de fazer isso.??? Valeu!!!
Nome : Marcelo E-Mail : marcelomws@terra.com.br
Fiz um teste aqui e descobri uma coisa ...
se usar o tc.Tabs(3).Enable = False ou invés do Visible ... funciona sem precisar da propriedade "registrar"

Parece ser alguma falha que o enable funciona como visible ...
Nome : Edson Domenech E-Mail : domenechbr@gmail.com
mas se usar tc.Tabs(3).Enable = false, vai desabilitar todos os componentes q estão dentro dessa tab, e ai nem q tenha um Div com disabled=false eles habilita....
Nome : Daniel Rocha E-Mail : danielrdc@hotmail.com
Boa Tarde

Gostaria de saber como apagar todo o conteúdo inserido nos textbox dentro de uma tab, toda vez que clicar numa tab diferente e retornar a mesma tab.

Obrigado

Daniel Rocha
Nome : Bruno Teles E-Mail : bruno.teles@cpmbraxis.com
Olá,
Seu artigo é muito bom mas estou com um problema. Na página web quando as abas são criadas aparece uma imagem na frente de cada uma delas. Sabe me dizer o que pode estar acontecendo?
Nome : Bruno Teles E-Mail : bruno.teles@cpmbraxis.com
Olá,
Seu artigo é muito bom mas estou com um problema. Na página web quando as abas são criadas aparece uma imagem na frente de cada uma delas. Sabe me dizer o que pode estar acontecendo?
Nome : Bruno Teles E-Mail : bruno.teles@cpmbraxis.com
Olá,
Seu artigo é muito bom mas estou com um problema. Na página web quando as abas são criadas aparece uma imagem na frente de cada uma delas. Sabe me dizer o que pode estar acontecendo?
Nome : Bruno Teles E-Mail : bruno.teles@cpmbraxis.com
Olá,
Seu artigo é muito bom mas estou com um problema. Na página web quando as abas são criadas aparece uma imagem na frente de cada uma delas. Sabe me dizer o que pode estar acontecendo?
Nome : Wallace E-Mail : wallcarlos@hotmail.com
Olá Dennis,
Gostei muito do Tutorial, mas gostaria de saber se existe alguma propriedade do tabContainer para que as abas fiquem na lateral ou comecem da direita para a esquerda. Grato desde já.
Nome : Dennes E-Mail : dennes@bufaloinfo.com.br

Não até quando observei, mas foi disponibilizada uma nova versão recente. Não creio que tenham adicionado isso, mas tudo é possível.
Nome : viviane E-Mail : viviane.lessa@rybius.com
Olá!
Uso o Visual Studio 2008.
Quando crio uma segunda aba o conteudo desta some em runtime.
Gostaria de saber tb a diferença entre criar um New Web Site e Um Ajax ControlTollkit Web Site.
Obrigada,
Nome : Dennes E-Mail : dennes@bufaloinfo.com.br

A diferença em um website e um ajax control toolkit website está apenas nos detalhes de template do VS utilizados, que facilitam mais ou menos o uso do ajax control toolkit. O resultado final é o mesmo.

[]'s

Dennes
Nome : E-Mail :
Nome : Luana E-Mail : mariaccq888@hotmail.com
Saludos cordiales,

Buen articulo.
Yo tambien he tenido algunas dudas sobre este control.
Tengo un tabpanel que no se porque causa no aparece en mi pagina
Pense que tenia que ver con su propiedad visible, pense que estaba en false.
Pero no fue eso, a pesar que le pongo en true no aparece.
POr favor si pudiera ayudarme.
Gracias de antemano.
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
-1'
Nome : -1' E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : -1'
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : 1 E-Mail : 1
1
Nome : FNv2odF2V E-Mail : 13i89lm7@hotmail.com
What saddens me is that most voters (myself included) aren&#8217;t voting FOR a carwedate:di&#8217;ne voting AGAINST the other guy.Issues are a joke: &#8220;A smoked dope in college!&#8221; &#8220;B had an affair!&#8221; &#8220;I&#8217;m pro-___/anti-___ now;never mind my voting record on the issue!&#8221;The news media is another joke.Used to be facts were presented as facts &amp; editorials as editorials:forget that!Nevertheless I will continue to vote:to not do so dishonors those who have died to assure me that right.And if nothing else if I don&#8217;t vote I can&#8217;t really bitch about where our country goes(God help us!).