none
Como estender a classe controls do windows form RRS feed

  • Pergunta

  •  Olá, minha duvida...
    Estendi alguns controles para conter um novo campo;

     

    private bool ativa;
    [
    Browsable(true)]
    [
    Category("AA_Personalizados")]
    public bool Ativa
    {
    get { return ativa; }
    set { ativa = value; }
    }
    Bem meu problemas esta aqui

     

    public class clsPreparaForm
    {
    public Bool Pronto(Form oForm)
    {
    foreach (Control controles in oForm.Controls)
    {
    // Aqui o C# não encontra o campo ativa, por q nao existe na classe pai Controls
    //Então como estender essa classe para q ela identifique novas propriedades dos meus
    //controles personalizados????????? 
        controles.ativa=True
    }
    return True;
    }
    }

    sexta-feira, 5 de fevereiro de 2010 09:03

Respostas

  • Aqui faz calor de noite (32o) e chuva de dia (to em Sampa ^^)

    ah... esse codigo ai q vc postou falto colocar a palavra class

    public interface IAtivable
    {
    bool Ativa { get; set
    ; }}
    public class MaskedTextBox: Control , IAtivable { }
     

    No mais ... é por ai mesmo ^^

    Se puder marcar o topico como respondido nos agradecemos :P

    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    domingo, 7 de fevereiro de 2010 20:06
    Moderador

Todas as Respostas

  • Acho que vc está confundindo controles do formulario que é o seu objeto, com as propriedades do seu objeto.
    Poderia explicar melhor sua duvida.?

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sexta-feira, 5 de fevereiro de 2010 18:30
  • Pois bem Dan, todos os controles tem a Tag certo? entaum queria mais campo assim como a Tag só que me retorne um bool assim eu saberia se o campo é de preenchimento obrigatorio pelo usuario.
    sexta-feira, 5 de fevereiro de 2010 22:51
  • Então, seu código que vc criou a propriedade está certo. Ele criou a propriedade, mas esta propriedade só existe no seu controle, e não nos controles de formulario como um textox.

    No seguinte trecho: foreach ( Control controles in oForm.Controls)   vc esta usando a classe control e nao a sua herdada. O que vc pode fazer é converter o control para o tipo do seu objeto e dai usar a propriedade.

    foreach ( Control controles in oForm.Controls)
    {
          if(controles is MeuControle)
    {
         var meuControl = (MeuControle)controles;
         var ativo = meuControl.Ativa;
    }
       
    }

    Se sua pergunta foi respondida por favor marque a resposta como certa.
    sábado, 6 de fevereiro de 2010 20:21
  • Ai Dani, if(controles is MeuControle) ( o "MeuControle" ou simplesmente MeuControle) e pode ficar assim
    if(controles is MeuControle1 || MeuControles2 || MeuControle3) ?

     e se com case:?
    sábado, 6 de fevereiro de 2010 21:56
  • Acho que com case não tem como fazer, ja tentei em VB.Net e nao consegui. Vai ter que fazer com if, mas nao desta maneira.
    Vai ter que fazer if, else if por que se vc fizer daquela forma vc nao vai saber depois para que tipo que vc vai fazer o cast. Se vc fizer cast para o MeuControle1 e o objeto for MeuControle2 vai dar erro.
    A ideia é a seguinte, vc faz um for nos controles do formulario, dai verifica se ele é do tipo do controle que vc criou no if, dai vc faz o cast para aquele objeto, dai vc vai conseguir acessar a propriedade.
    Se sua pergunta foi respondida por favor marque a resposta como certa.
    domingo, 7 de fevereiro de 2010 00:25
  • Ai Dani, if(controles is MeuControle) ( o "MeuControle" ou simplesmente MeuControle) e pode ficar assim
    if(controles is MeuControle1 || MeuControles2 || MeuControle3) ?

     e se com case:?

    Entao o Danimar explicou o certo...

    agora para o seu caso eh simples... se vc vai ter mais de um controle q usa essa propriedade... o certo seria cria uma interface... e usar a mesma em todo os seus controles...

    tipo:

    public interfade IAtivable {
        bool Ativa { get; set; }
    }

    public Control1: Control, IAtivable { }
    public Control2: Control, IAtivable { }
    public Control3: Control, IAtivable { }

    foreach ( Control controles in oForm.Controls)
    {
          if(controles is IAtivable)
    {
         var meuControl = (IAtivable)controles;
         var ativo = meuControl.Ativa;
    }
       
    }


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    domingo, 7 de fevereiro de 2010 01:15
    Moderador
  •  Ai Rui beleza??? Muito quente ai onde vc mora, nóis de Curitba estamos derretendo ten dia que chega aos 26°.

     Bem vc mato a charada; é isso mesmo que preciso, estender essa e outras propriedades que pretendo criar aos demais controles para não ter que testar todos em todas as novas propriedades senão vira um "saco" né?

     

    public interface IAtivable
    {
    bool Ativa { get; set; }}
    public MaskedTextBox: Control , IAtivable { } 
    Error 1 Invalid token ':' in class, struct, or interface member declaration C:\Documents and Settings\ClodoaldoP\Meus documentos\Visual Studio 2008\Projects\Controles_SobreCarregados\clsPreparaDados.cs 34 29 Controles_SobreCarregados

    domingo, 7 de fevereiro de 2010 11:01
  • Aqui faz calor de noite (32o) e chuva de dia (to em Sampa ^^)

    ah... esse codigo ai q vc postou falto colocar a palavra class

    public interface IAtivable
    {
    bool Ativa { get; set
    ; }}
    public class MaskedTextBox: Control , IAtivable { }
     

    No mais ... é por ai mesmo ^^

    Se puder marcar o topico como respondido nos agradecemos :P

    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    domingo, 7 de fevereiro de 2010 20:06
    Moderador
  • 32° ta louco tinha pedido as contas, mas Rui desculpa a fraqueza mas vou precisar de mais um auxilio doença onde vai esse trem
    (public interface IAtivable)
    Não faço a menor ideia...


    domingo, 7 de fevereiro de 2010 22:00
  • quando vc clica em Add New Item no seu projeto (por exemplo para colocar um Form novo nele...) tem la a opçao de criar uma Interface...

    e nesse arquivo q vc pode criar a mesma...
    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    domingo, 7 de fevereiro de 2010 22:05
    Moderador
  • Bem agora acho que vo conseguir...

    Mas o infeliz não copilou 

    using

     

    System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;using System.Windows.Forms;
    namespace Controles_SobreCarregados
    {
    public interface IAtivable
    {
    bool Ativa { get; set; }
    }
    public class MaskedTextBox : Control, IAtivable { }
    }
    Error 1 'Controles_SobreCarregados.MaskedTextBox' does not implement interface member 'Controles_SobreCarregados.IAtivable.Ativa' C:\Documents and Settings\ClodoaldoP\Meus documentos\Visual Studio 2008\Projects\Controles_SobreCarregados\IAtivable.cs 14 18 Controles_SobreCarregados
    //Este abaixo fico legal

    using

     

    System;
    using System.Collections.Generic;
    using System.Text;
    using System.Windows.Forms;
    namespace Controles_SobreCarregados
    {
    public class clsPreparaDados
    {
    public void AtivaCampos(Form oForm)
    {
    foreach (Control controles in oForm.Controls)
    if (controles.Ativa)
    controles.Enabled =
    true;
    }}}

    domingo, 7 de fevereiro de 2010 23:19
  • a entao... da uma pesquisada so o uso de interfaces kkkkk

    é assim quando vc declar que a uma classe herda uma interface vc tem que implementar os metodos da mesma....

    public class MaskedTextBox : Control, IAtivable
         public bool Ativa { get; set; }

         [...]
    }

    no mais falto ainda fazer a verificaçao se o tipo herda dessa interface e fazer o cast....

    foreach (Control controle in oForm.Controls) {
        if (controle is IAtivable) {
              controle.Enabled = (controle as IAtivable).Ativa;
        }
    }

    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    domingo, 7 de fevereiro de 2010 23:57
    Moderador
  • O problema é chegar na classe dos controles, como chegar por exemplo na do Mask?
    segunda-feira, 8 de fevereiro de 2010 00:00
  • Bem... o certo seria vc criar uma classe sua

    public class MyMaskEdit: MaskedTextBox, IAtivable {
     }

    so que acho q o MaskedTextBox... é sealed se nao engano...

    ai nesse casos eu faço do jeito mais chato... que eh criar um UserControl com um makedtextbox dentro... e recriar todas as propriedades para setar as do masktext...


    What would Brian Boitano do ?
    ((2B || !2B) is Question) ?
    segunda-feira, 8 de fevereiro de 2010 00:04
    Moderador