none
Como passar uma "classe?" como parâmetro para um form???

    Question

  •  

    Não sei se é exatamento isso que tenho que fazer, vou tentar explicar resumidamente o que pretendo fazer:

    1) Crio uma classe Agenda conforme abaixo:

    public class Agenda

    {

    public Agenda()

    {

    }

    public Agenda(int idagenda, string nome, string telefone, int idade, DateTime datainscricao)

    {

    this.idagenda = idagenda;

    this.nome = nome;

    this.telefone = telefone;

    this.datainscricao = datainscricao;

    }

    private int idagenda;

    [DataBaseIDField("IDAgenda",true,"@IDAgenda","999999")]

     

    public int IDAgenda

    {

    get { return idagenda; }

    set { idagenda = value; }

    }

    ....

    2) Tenho um único form de pesquisa(genérico) que gostaria de passar alguns parâmetros, entre eles está classe acima da seguinte forma:

    Utilizando Generics, crio uma instancia da classe Agenda assim

    DataBaseClass<Agenda> objeto = new DataBaseClass<Agenda>()

    Isto é feito e tem que ser feito antes de chamar o form uma vez que a pesquisa genérica pode ser da Agenda, Marca, Produto, etc.

    Gostaria de poder passar este objeto como um parâmetro para o form e não estou conseguindo pois não sei como criar o seu tipo.

    No form tentei colocar:

    public partial class PesquisaListViewGenerica<T> : Form where T: class

    dá erro de compilação dizendo não ser possível fazer isso no form.

     

    Alguém poderia me dar uma luz?

     

    Desde já agradeço

     

    Thursday, April 10, 2008 4:18 AM

Answers

  • cara segue ai..

    tomara que te ajude...

     

    [classe usada]


    using System;
    using System.Collections;

    namespace teste
    {
     [Serializable]
     public sealed class Pergunta
     {

      #region Private Members
      private bool m_isChanged;

      private string m_idpergunta;
      private string m_perguntaname;
      private string m_help;   
      #endregion

      #region Default ( Empty ) Class Constuctor
      /// <summary>
      /// default constructor
      /// </summary>
      public Pergunta()
      {
                m_idpergunta = "";
                m_perguntaname = "";
                m_help = "";
      }
      #endregion // End of Default ( Empty ) Class Constuctor

      #region Required Fields Only Constructor
      /// <summary>
      /// required (not null) fields only constructor
      /// </summary>
      public Pergunta(
       string perguntaname)
       : this()
      {
       m_perguntaname = perguntaname;
       m_help = null;
      }
      #endregion // End Required Fields Only Constructor

      #region Public Properties
       
      /// <summary>
      ///
      /// </summary>
      public string IdPergunta
      {
       get { return m_idpergunta; }
       set
       {
        if( value == null )
         throw new ArgumentOutOfRangeException("Null value not allowed for IdPergunta", value, "null");

        m_isChanged |= ( m_idpergunta != value );
        m_idpergunta = value;
       }

      }
       
      /// <summary>
      ///
      /// </summary>
      public string PerguntaName
      {
       get { return m_perguntaname; }
       set
       {
        if( value == null )
         throw new ArgumentOutOfRangeException("Null value not allowed for PerguntaName", value, "null");

        m_isChanged |= ( m_perguntaname != value );
        m_perguntaname = value;
       }

      }
       
      /// <summary>
      ///
      /// </summary>
      public string Help
      {
       get { return m_help; }
       set
       {
        m_isChanged |= ( m_help != value );
        m_help = value;
       }

      }
       
      /// <summary>
      /// Returns whether or not the object has changed it's values.
      /// </summary>
      public bool IsChanged
      {
       get { return m_isChanged; }
      }
        
      #endregion
     }
    }

     

    [Codigo do formulario principal]

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace MSDN
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            private void Form3_Load(object sender, EventArgs e)
            {
                teste.Pergunta perg = new teste.Pergunta();
                perg.Help = "Bla bla blab lablba ";
                perg.PerguntaName = "djfksjfldkjfasçlkjfdasçlkfjdsaçlfdkj";
                Form1 frmcom = new Form1();
                frmcom.Classse = perg;
                frmcom.ShowDialog();
            }
        }
    }

    [Codigo do formulario secundario]

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace MSDN
    {
        public partial class Form1 : Form
        {
            private object _classse;

            public object Classse
            {
                get { return _classse; }
                set { _classse = value; }
            }
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //aqui e so fazer um metodo e converter para o tipo que voce quiser...
                MessageBox.Show(((teste.Pergunta)Classse).Help);
               
            }
            
           
        }
    }

    Saturday, April 12, 2008 3:42 AM

All replies

  • Lucas

     

    voce pode passar um objeto via construtor no formulario

     

    public class Teste

    {

    }

     

    public partial class PesquisaListViewGenerica<T> : Form where T : class

    {

    //Construtor do formulario

    public PesquisaListViewGenerica(T obj)

    {

    }

    }

     

    Teste t = new Teste();

    PesquisaListViewGenerica<Teste> formulario = new PesquisaListViewGenerica<Teste>(t);

     

    Espero ter ajudado

    Thursday, April 10, 2008 11:53 AM
  • Olá Klayton, obrigado pela resposta porém eu já tentei isso e não funciona

    O código:

    public partial class Form1<T> : Form where T : class

    {

    public Form1(T obj)

    {

    InitializeComponent();

    }

    }

     

    o erro quando se tenta compilar:

    Error 1 'Form1.Dispose(bool)': no suitable method found to override C:\Users\Lucas\Documents\Visual Studio 2005\Projects\Form1.Designer.cs 14 33

     

    Me parece que você só consegue utilizar <T> em classes não visuais.

    abs

    Thursday, April 10, 2008 2:30 PM
  • Lucas

     

    dar uma olhada no teu codigo pois efetuei teste aqui e funcionou normalmente.

     

    Sim esquecir de um detalhe quando voce mudou o form para generico voce tambem mudou as outras classes parciais existentes desse formulario provavelmente o erro estar ai porque as outras classes parciais tambem precisam ser genericas. o Form1.Designer.cs tambem tem que ser mudado observa isso no seu codigo

     

    Outra pergunta qual a necessidade de voce estar criando um formulario generico quando poderia passar um objeto

     

    public partial class Form1 : Form

    {

    public Form1(Object obj)

    {

    InitializeComponent();

    }

    }

     

    abraço.

    Thursday, April 10, 2008 5:27 PM
  • Klayton, mais uma vez muito obrigado.

    Realmente faltava mudar o Designer.cs porém mesmo assim não resolveu meu problema.

    Se eu passar como um Generic através de Form1<T> ou no construtor do form, caio no mesmo problema.

    Em qq um dos 2 casos, não consigo acessar as Propriedades, métodos, etc diretamente, acho que terei que recorrer a reflection.

     

    De qualquer forma muito obrigado pela ajuda

     

    Friday, April 11, 2008 1:06 AM
  • Cara,
     boa noite,
     Ja fiz isso sem ter que quebrar tanto a cabeça assim..

     No meu caso os dois forms estavam no mesmo namespace, e havia um de selecionar dados e outro para pesquisa,
    montei uma classe com os dados que precisava na tela de pesquisa que o cara selecionava na parte de seleção...
     No form de pesqiuisa fiz um atributo do tipo da classe q queria, e gerei uma propriedade publica.
     Quando o usaurkio seleiconava o que ele queria eu preenchia as propriedades da classe e depois passava a classe
    na prop que havia criado no form de busca... dessa forma acessava tdo sem relection e nda do tipo

    Friday, April 11, 2008 4:26 AM
  • Olá Leandro,

     

    Talvez eu esteja pegando o caminho mais difícil por desconher outras formas.

    Como vc conseguiu acessar as propriedades, métodos, etc com o atributo do tipo classe que fez no form de pesquisa uma vez que não se sabe que tipo de classe irá passar, exemplo: produto, marca, fornecedor, etc...?

    teria como compartilhar o código conosco?

     

    grato,

     

    Saturday, April 12, 2008 2:32 AM
  • Cara,

    O código esta no micro da empresa...

     

    Mas voce pode fazer o seguinte para facilitar a sua vida, no form superior ou seja onde vc quer acessar voce pode fazer uma prop para cada classe !!!

     

    Se forem muitas classes voce pode fazer uma prop de um object e faz um metodo que pega a prop e com o GetType voce verifica qual classe é, assim acessa as propriedades ou metodos que quiser..

     

     

    Caso não tenha resolvido até segunda, ai eu te mando !!!

     

     

     

     

    Saturday, April 12, 2008 3:10 AM
  • cara segue ai..

    tomara que te ajude...

     

    [classe usada]


    using System;
    using System.Collections;

    namespace teste
    {
     [Serializable]
     public sealed class Pergunta
     {

      #region Private Members
      private bool m_isChanged;

      private string m_idpergunta;
      private string m_perguntaname;
      private string m_help;   
      #endregion

      #region Default ( Empty ) Class Constuctor
      /// <summary>
      /// default constructor
      /// </summary>
      public Pergunta()
      {
                m_idpergunta = "";
                m_perguntaname = "";
                m_help = "";
      }
      #endregion // End of Default ( Empty ) Class Constuctor

      #region Required Fields Only Constructor
      /// <summary>
      /// required (not null) fields only constructor
      /// </summary>
      public Pergunta(
       string perguntaname)
       : this()
      {
       m_perguntaname = perguntaname;
       m_help = null;
      }
      #endregion // End Required Fields Only Constructor

      #region Public Properties
       
      /// <summary>
      ///
      /// </summary>
      public string IdPergunta
      {
       get { return m_idpergunta; }
       set
       {
        if( value == null )
         throw new ArgumentOutOfRangeException("Null value not allowed for IdPergunta", value, "null");

        m_isChanged |= ( m_idpergunta != value );
        m_idpergunta = value;
       }

      }
       
      /// <summary>
      ///
      /// </summary>
      public string PerguntaName
      {
       get { return m_perguntaname; }
       set
       {
        if( value == null )
         throw new ArgumentOutOfRangeException("Null value not allowed for PerguntaName", value, "null");

        m_isChanged |= ( m_perguntaname != value );
        m_perguntaname = value;
       }

      }
       
      /// <summary>
      ///
      /// </summary>
      public string Help
      {
       get { return m_help; }
       set
       {
        m_isChanged |= ( m_help != value );
        m_help = value;
       }

      }
       
      /// <summary>
      /// Returns whether or not the object has changed it's values.
      /// </summary>
      public bool IsChanged
      {
       get { return m_isChanged; }
      }
        
      #endregion
     }
    }

     

    [Codigo do formulario principal]

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace MSDN
    {
        public partial class Form3 : Form
        {
            public Form3()
            {
                InitializeComponent();
            }

            private void Form3_Load(object sender, EventArgs e)
            {
                teste.Pergunta perg = new teste.Pergunta();
                perg.Help = "Bla bla blab lablba ";
                perg.PerguntaName = "djfksjfldkjfasçlkjfdasçlkfjdsaçlfdkj";
                Form1 frmcom = new Form1();
                frmcom.Classse = perg;
                frmcom.ShowDialog();
            }
        }
    }

    [Codigo do formulario secundario]

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace MSDN
    {
        public partial class Form1 : Form
        {
            private object _classse;

            public object Classse
            {
                get { return _classse; }
                set { _classse = value; }
            }
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                //aqui e so fazer um metodo e converter para o tipo que voce quiser...
                MessageBox.Show(((teste.Pergunta)Classse).Help);
               
            }
            
           
        }
    }

    Saturday, April 12, 2008 3:42 AM
  • Sobrecarregue o construtor do Form.

    Assim:

     

    //Default

    public Form()

    {

    InitializeComponent();

    }

     

    //Teu constructor

    public Form(T obj) : this()

    {

    //Inicializacoes, etc.

    }

     

    E quando for chamar o Form chama primeiro o teu constructor que ele se encarregara de chamar o Defaut.

    E tu tb nao precisara alterar o programa em nenhum outro lugar.

    Flw.

    Sunday, April 13, 2008 2:05 PM
  • Valeu

    Monday, April 14, 2008 4:47 PM
  • Cara, tu nao respondeu se funcionou, ou nao, o que te passei. Se tiver ajudado posta ai.

    []'s

    Monday, May 05, 2008 12:02 PM