none
Como testar se um controle tem determinada propriedade RRS feed

  • Pergunta

  • Espero que alguem consiga me ajudar:

    Todos os controles do windows form tem a propriedade "TAG" ok

    Vamos pegar o textbox q tem a "TAG" e "Text"

    Ja o checkbox no "Text" (se tiver imagine que no tem s pra montar o exemplo)

    Criei um checkbox personalizado e estendi para que ele tenha a propriedade "Text"

    em algum momento passo uma linha assim: MyCheckBox.Text = "1"; ou ainda vira por Default MyCheckBox.Text= "0";

    Muito bem quando eu fazer um foreach no form preciso testar se o controle tem a propriedade text, uma vez q

    entre outros os controle de Opo e os proprios checkbox no estendidos no tero .Text

    Pergunta como montar essa instruo

    foreach ( Control ctrl in controles )

    {

    if ( ctrl "Controle vc tem essa propriedade"=.Text? )

    {

    ctrl.Text = "";

    }

    }

    Na verdade sero mais de uma propriedade nova, uma pra Limpar texto outra pra ativar o controle...

    Mas se alguem tiver uma dica pra este caso os outros tb sero resolvidos pela mesma linha

    segunda-feira, 8 de fevereiro de 2010 15:11

Respostas

  • Olá Clodoaldo,

    Não entendi a sua pergunta... Todos os controles que herdam da classe Control possuem a propriedade Text. No seu exemplo acima, você consegue acessar essa propriedade através da instância do controle...

    De qualquer forma, se você pretende ter comportamentos diferentes para os vários tipos de controle, o mais simples é utilizar uma expressão LINQ:

    // Selecione todos os controles do tipo TextBox e
    // preencha-os com um texto qualquer
    this.Controls
        .OfType<TextBox>()
        .ToList()
        .ForEach(t => t.Text = "Alguma Coisa");
    
    


    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://www.caioproiete.com
    segunda-feira, 8 de fevereiro de 2010 15:19
    Moderador

  • No caso da propriedade Text (para Windows Forms) o que o Caio disse acima resolve o problema...

    no caso de outras propriedades:

    using System.Reflection;

    foreach(Control c in this.Controls) {
        var property =  c.GetType().GetProperty("Text");
        if (property == null) continue;

        property.SetValue(c, "Alguma Coisa", null);
    }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    segunda-feira, 8 de fevereiro de 2010 17:38
    Moderador
  • ah entao para vc pegar o valor da propriedade usando reflection vc faz assim


    Object valor = property.GetValue(c, null);  // onde 'c' é a instancia do seu objeto

    o metodo sempre retorna Object... entao para usar uma variavel booleana tem q fazer o cast

    Bool enabled = (bool)property.GetValue(c, null);
    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    • Marcado como Resposta ClodoaldoPereira terça-feira, 9 de fevereiro de 2010 14:55
    terça-feira, 9 de fevereiro de 2010 13:49
    Moderador

Todas as Respostas

  • Espero que alguem consiga me ajudar:

    Todos os controles do windows form tem a propriedade "TAG" ok

    Vamos pegar o textbox q tem a "TAG" e "Text"

    Ja o checkbox no "Text" (se tiver imagine que no tem s pra montar o exemplo)

    Criei um checkbox personalizado e estendi para que ele tenha a propriedade "Text"

    em algum momento passo uma linha assim: MyCheckBox.Text = "1"; ou ainda vira por Default MyCheckBox.Text= "0";

    Muito bem quando eu fazer um foreach no form preciso testar se o controle tem a propriedade text, uma vez q

    entre outros os controle de Opo e os proprios checkbox no estendidos no tero .Text

    Pergunta como montar essa instruo

    foreach ( Control ctrl in controles )

    {

    if ( ctrl "Controle vc tem essa propriedade"=.Text? )

    {

    ctrl.Text = "";

    }

    }

    Na verdade sero mais de uma propriedade nova, uma pra Limpar texto outra pra ativar o controle...

    Mas se alguem tiver uma dica pra este caso os outros tb sero resolvidos pela mesma linha

    segunda-feira, 8 de fevereiro de 2010 15:18
  • Olá Clodoaldo,

    Não entendi a sua pergunta... Todos os controles que herdam da classe Control possuem a propriedade Text. No seu exemplo acima, você consegue acessar essa propriedade através da instância do controle...

    De qualquer forma, se você pretende ter comportamentos diferentes para os vários tipos de controle, o mais simples é utilizar uma expressão LINQ:

    // Selecione todos os controles do tipo TextBox e
    // preencha-os com um texto qualquer
    this.Controls
        .OfType<TextBox>()
        .ToList()
        .ForEach(t => t.Text = "Alguma Coisa");
    
    


    Abraços,
    Caio Proiete



    Caio Proiete
    Microsoft MVP, MCT, MCPD, MCTS, MCSD
    http://www.caioproiete.com
    segunda-feira, 8 de fevereiro de 2010 15:19
    Moderador

  • No caso da propriedade Text (para Windows Forms) o que o Caio disse acima resolve o problema...

    no caso de outras propriedades:

    using System.Reflection;

    foreach(Control c in this.Controls) {
        var property =  c.GetType().GetProperty("Text");
        if (property == null) continue;

        property.SetValue(c, "Alguma Coisa", null);
    }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    segunda-feira, 8 de fevereiro de 2010 17:38
    Moderador
  • Desculpa a demora, e que trabalho com VB6 e estou começando no C# só estudando a noite e nos finais de semana.

    Pois então Caio, que acho que não consigo passar as novas propriedades que pretendo criar para todos os controle que vou estender, vou tentar detalhar.
    Digamos vou estender TextBox e ComboBox, com duas novas propriedades, Ativa e Visivel
    Abri uma nova classe: class txText : TextBox
    e assim para combo tb, isso como vc sabe cria um novo componente estendido e dentro as novas propriedades.

    Os originais que não contem essa propriedades estao na lista em foreach (Control controles in oForm.Controls)
    veja que o form passo o form por parametro para o metodo que executa foreach, então qd o "for" alcançar os controle que não teem a propriedade Visivel ou Ativa vai dar erro e nao quero e acho que não precisaria testar cada qual pra ver se é o estendido, imagine um dia que eu resolva estender outros e ai teria que ir aumentando... até um dia esquecer e isso causar um grave erro
    No exemplo q vc passou...
    this.Controls
        .OfType<TextBox>()
        .ToList()
        .ForEach(t => t.Text = "Alguma Coisa");
    Funciona como With do VB?
    poderia ser assim:
    oForm.Controls
        .OfType<TextBox>()
        .ToList()
        .ForEach(t => t.Text = "Alguma Coisa");




       
    segunda-feira, 8 de fevereiro de 2010 23:36
  • Olá Rui, demorei mas no trabalho naum da pra responder, o seguinte vo testar amanha e a noite ja te retorno com certeza com mais duvidas (rs), obrigado por me ajudar.




    abs
    segunda-feira, 8 de fevereiro de 2010 23:38
  • Sem crise...

    so explicando...eh q o Caio abordou o caminho da herança de objetos, como vc disse q queria usar a propriedade Text de um componente herdado do Control... entao seu componente tambem vai ter a propriedade Text...

    Agora para as demais propriedades dos "Filhos" de Control -  (The Sons of Controls... isso da nome de musica) - ai tem a possibilidade mesmo ou de implementar uma interface comum para todos os controls (melhores praticas de OO) ou usar o Reflection que eu mostrei no exemplo...

    o Reflection é mais usado quando vc trabalha com dll de ternceiros e as mesmas nao vem com uma Interface implmenentada...
    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    terça-feira, 9 de fevereiro de 2010 01:22
    Moderador
  • Bom dia Rui e Caio e os amigos que nos leem agora, olha a hora que acordei hj  pra poder estudar  isso 05:30.... agora ja são 6:20

    Gostei da sua ideia Rui, mas falto alguma coisinha ve se podem me ajudar

     

    foreach (Control c in oForm.Controls)

    {

     

    var property = c.GetType().GetProperty("Enabled");//imagine que Enabled seja uma propriedade criada por ns

     

    if (property == null) continue;

     

    if (property == false) //não copilo

    c.Visible =

     

    false;

    }

    //Error 1 Operator '==' cannot be applied to operands of type 'System.Reflection.PropertyInfo' and 'bool'

    }



    terça-feira, 9 de fevereiro de 2010 08:24
  • Ola Caio tem como encima do que vc passo
    this.Controls
        .OfType<TextBox>()
        .ToList()
        .ForEach(t => t.Text = "Alguma Coisa");
    pegar a lista dos controles que tem uma propriedade?
    Vamos dizer assim com eu disse criei duas novas propriedades
    this.Controls
        .MonteaListaComControlesComEstaPropriedade<NovaPropriedade>()
        .ToList()
        .ForEach( t => t.NovaPropriedade)
                     if(NovaPropriedade==false)
                                  t.Visible=false;

    ou acho que podeira ficaar assim;
    .ForEach(t => t.Visible = t.NovaPropriedade);

    Sei que vc's não são parteiros mas se conseguir da Luz ai vou ficar muito grato...

    terça-feira, 9 de fevereiro de 2010 08:36
  • ah entao para vc pegar o valor da propriedade usando reflection vc faz assim


    Object valor = property.GetValue(c, null);  // onde 'c' é a instancia do seu objeto

    o metodo sempre retorna Object... entao para usar uma variavel booleana tem q fazer o cast

    Bool enabled = (bool)property.GetValue(c, null);
    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    • Marcado como Resposta ClodoaldoPereira terça-feira, 9 de fevereiro de 2010 14:55
    terça-feira, 9 de fevereiro de 2010 13:49
    Moderador
  • Ai Rui foi beleza cara, funcional mesmo

    Muito obrigado!!!!!!!!!!
    terça-feira, 9 de fevereiro de 2010 14:57