Array
(
)

Recuperar controles de uma página com master page.

Hal9000
   - 01 jun 2008

Olá a todos.

Montei uma rotina no meu sistema que percorre todos os controles de uma pagina e habilita ou desabilita eles ´Enabled´ funcionava que é uma beleza, mas o pessoal do design meteu uma masterpage e agora o código não recupera mais! Alguem sabe como eu faço para referenciar esses controles que agora estão numa página com master page?

Hal9000
   - 01 jun 2008

Nãi é possível passei a manhã no google e nada! Como eu consigo fazer um for each para pegar todos os controles que estão na minha página com Master Page? Já use Master, ContentPlaceHolder! Tudo! Alguém sabe?!?!

Ricardo Silva
   - 02 jun 2008

veio....

qndo vc coloca uma masterPage... os nome do Documentos HTML muda um poquim...

pra descobrir os Novos nome, vc executa o seu projeto e vai no codigo fonte do seu HTML.
provavelmente ele vai estar assim: ctl00_ContentPlaceHolder1_TextBox1, o que muda é o nome do do ContentPlaceHouder que armazena todos os controles

na duvida soh posta

Hal9000
   - 02 jun 2008

Então. esse lance de mudar o nome dos controles eu já to por dentro.

o meu problema é que preciso de um método genérico que percorra todos os controles da minha página.

eu fiz assim e sem master funciona:

#Código

    Public Sub DesligaSubmit(ByVal Pagina As Page)
        For Each Controle As Control In Pagina.Controls
            If TypeOf Controle Is Button Then
                Dim Botao As New Button
                Botao = DirectCast(Controle, Button)
                Botao.UseSubmitBehavior = False
            End If
        Next
    End Sub


Eu passo a página e quero recuperar os controles, mas na master a coleção de controles vem com um único item. a própria master :(

Ricardo Silva
   - 02 jun 2008

se eu não me engano.. vc vai ter q colocar outro lupe dentro desse foreach. tipo assim... na sua pagina ele vai encontar um controle que eh o ContentPlaceHolder, os controles estão dentro deles.
#Código

Public Sub DesligaSubmit(ByVal Pagina As Page)
        For Each Controle As Control In Pagina.Controls
            For Each Ctr As Control In Controle
                If TypeOf Ctr Is Button Then
                Dim Botao As New Button
                Botao = DirectCast(Ctr, Button)
                Botao.UseSubmitBehavior = False
               End If
           Next
       Next
    End Sub 


não manjo nada de VB mais axo qw ficaria assim, pois fiz algo parecido em C# na facu... ve se da certo e posta ai....
Ah outra dica, é ir debugando e procurando os Objetos ai fica facil

na duvida soh posta

Hal9000
   - 02 jun 2008

Testei sua idéia Rica mas o tipo Control não é um Array de controles

entao a linha:

For Each Ctr As Control In Controle dá pau
:(

Alguma idéia nova? Eu continuo procurando...

Ricardo Silva
   - 03 jun 2008

entaum no lugar de for each faz simplesmente um for...
#Código

Public Sub DesligaSubmit(ByVal Pagina As Page)
        For Each Controle As Control In Pagina.Controls
            For(int i = 0; i >  Controle.count - 1; i++)
                If TypeOf Controle[i] Is Button Then
                   Dim Botao As New Button
                   Botao = DirectCast(Controle[i], Button)
                   Botao.UseSubmitBehavior = False
               End If
           Next
       Next
    End Sub 


ja... sei meu for ta em C (rsrsrsr) não sei como é em VB
mas creio q seja assim, pois se o componente não for uma coleção o count dele sera 1 logo ele vai pro proximo controle ateh axar uma coleção ai ele netra no for... e sucetivamente.

tenta lah....

Hal9000
   - 03 jun 2008

Olha só testei com um for ´simples´

#Código

    For Each Controle As Control In Pagina.Controls
            For ind = 0 To Controle.Controls.Count - 1
                If TypeOf Controle.Controls(ind) Is Button Then
                    Dim Botao As New Button
                    Botao = DirectCast(Controle.Controls(ind), Button)
                    Botao.UseSubmitBehavior = False
                End If
            Next
        Next


Mas passa batido rs.
Vou tentar passar o ContentPlaceHolder ao invés da página...

Mas só para constar:

o For do VB é bem mais elegante... rs :wink:

For ind = 0 To Controle.Controls.Count - 1

Ok ok.. Os dois fazem a mesma coisa...

Vou testar e volto a postar...

Hal9000
   - 05 jun 2008

Rica.. Resolvi o problema. Vc tinha razão quanto a pesquisar a controles dentro de controles, mas para funcionar tem que usar recursividade.

olha só:

#Código

  Public Sub DesligaSubmit(ByVal Pagina As Control)
        For Each Controle As Control In Pagina.Controls
            If TypeOf Controle Is Button Then
                Dim Botao As New Button
                Botao = DirectCast(Controle, Button)
                Botao.UseSubmitBehavior = False
            Else
                ´RECURSIVIDADE AQUI
                DesligaSubmit(Controle)
            End If
        Next
    End Sub


Valeu pela ajuda...

Ricardo Silva
   - 05 jun 2008

Ah... muleeeeeque...

é issso ai...
fiquei morrendo de medo de mandar vc usar recurssividade pra vc naum assusta - vai q vc manda eu vazer um exemplo VB (rsrsrs)- mas é isso ai.... vc vez certim.

Parabens...

Hal9000
   - 05 jun 2008

Rica, segue post para o pessoal do C# num ficar brabo comigo.. rs

#Código

 public void DesligaSubmit(Control Pagina)
 {
     foreach (Control Controle in Pagina.Controls) {
         if (Controle is Button) {
             Button Botao = new Button();
             Botao = (Button)Controle;
             Botao.UseSubmitBehavior = false;
         }
         else {
             //RECURSIVIDADE AQUI
             DesligaSubmit(Controle);
         }
     }
 }