Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodrigo210881

Acessando objetos em memória em múltiplos forms

Recommended Posts

Gente, estou com uma dificuldade tremenda. Estou começando a pouco tempo em C#. Tenho experiência em C,C++

 

É o seguinte, tenho um documento de classe no meu projeto chamado Carros.cs...

 

Em um dos formulários crio objetos Carros, no outro é para "dirigir" o carro. Fazer uma simulação...

 

criei um array de objetos

 

clsCarrosProp[] Carro2 = new clsCarrosProp[clsDefinicoes1.iMaxNumCarros1];

para criar um determinado objeto

 

clsCarrosProp Carro2[iCont] = new clsCarrosProp();

Incluo ele, exibo em um DataGridView, e ao clicar em simular, exibo um novo form com um outro DataGridView. Não consigo listar os carros neste DataGridView...tentei no formulário de simulação acessar os dados do DataGridView do form de inclusão dessa forma:

 

public frmClasseCarrosProp pfrmClasseCarrosProp = new frmClasseCarrosProp();

e acessar aos valores do DataGridView do form de inclusão da seguinte maneira:

 

dgvCarros2.Rows.Add(pfrmClasseCarrosProp.dgvCarros1[0, 0].Value
                                , pfrmClasseCarrosProp.dgvCarros1[0, 1].Value
                                , pfrmClasseCarrosProp.dgvCarros1[0, 2].Value
                                , pfrmClasseCarrosProp.dgvCarros1[0, 3].Value);

 

 

O Código está assim para quem quiser ver:

 

classe Carros:

 

 

namespace codclsCarrosProp
{
    class clsCarrosProp
    {
        //Criando variáveis privadas para serem utilizadas como propriedades
        private string strModelo;
        private string strFabricante;
        private string strCor;
        private string strAnoModelo;

        //Propriedade para receber e retornar um valor
        //a partir de uma variável(campo) privada
        //Contém os métodos get e set
        public string StrModelo
        {
            get { return strModelo; }
            set { strModelo = value; }
        }

        //Propriedade para receber e retornar um valor
        //a partir de uma variável(campo) privada
        //Contém os métodos get e set
        public string StrFabricante
        {
            get { return strFabricante; }
            set { strFabricante = value; }
        }

        //Propriedade para receber e retornar um valor
        //a partir de uma variável(campo) privada
        //Contém os métodos get e set
        public string StrCor
        {
            get { return strCor; }
            set { strCor = value; }
        }

        //Propriedade para receber e retornar um valor
        //a partir de uma variável(campo) privada
        //Contém os métodos get e set
        public string StrAnoModelo
        {
            get { return strAnoModelo; }
            set { strAnoModelo = value; }
        }

        //Controladores internos próprio da classe        
        private bool bLigado;
        private int iMarcha;
        private bool bDesligado;
        private bool bParado;

        //Propriedade permitindo acesso externo ao valor de uma variável
        //privada. Variável neste caso é um controlador interno da classe,
        //não podendo ter seu valor alterado externamente.
        //Contém apenas método get.
        public bool BDesligado
        {
            get { return bDesligado; }
        }

        //Inicializando as variáveis       
        public clsCarrosProp()
        {            
            strModelo = "Nenhum";
            strFabricante = "Nenhum";
            strCor = "Nenhuma";
            strAnoModelo = "Não cadastrado";
            bLigado = false;
            iMarcha = 0;
            bDesligado = true;
            bParado = true;
            //bDesligado2 = true;
            clsContadores1.iNumCarros1++;
        }
        
        //Destrutor sem comando adicional
        ~clsCarrosProp()
        {
                            
        }

        //método para ligar
        public string strLigar()
        {
            string strRetorno = "";
            if (bLigado == true)
            {
                strRetorno = "Status: Carro já está ligado";
                return strRetorno;
            } else {
                bLigado = true;
                bDesligado = false;
                //bDesligado2 = bDesligado;
                bParado = true;
                strRetorno = "Status: Carro Ligado.";
                return strRetorno;
            }
        }
    }
}

 

 

No form de inclusão, incluo-os assim:

 


        //Crio um array de objetos
        clsCarrosProp[] Carro2 = new clsCarrosProp[clsDefinicoes1.iMaxNumCarros1];

        //Inclusão dos carros:
        private void vIncluirCarro1()
        {
            if (txtModelo1.Text == "" || txtFabricante1.Text == ""
                    || txtCor1.Text == "" || txtAnoModelo1.Text == "")
            {
                MessageBox.Show("Preencha todos os campos");
                return;
            }
            for (int iCont1 = 0; iCont1 < clsDefinicoes1.iMaxNumCarros1; iCont1++)
            {
                if (Carro2[iCont1] == null)
                {
                    continue;
                }
                else
                {
                    if(txtModelo1.Text == Carro2[iCont1].StrModelo
                        && txtFabricante1.Text == Carro2[iCont1].StrFabricante
                        && txtCor1.Text == Carro2[iCont1].StrCor
                        && txtAnoModelo1.Text == Carro2[iCont1].StrAnoModelo)
                    {
                        MessageBox.Show("Carro já incluso.", "Atenção", MessageBoxButtons.OK);
                        return;
                    }
                       
                }
            }
            
            for (int iCont2 = 0; iCont2 < clsDefinicoes1.iMaxNumCarros1; iCont2++)
            {
                if (Carro2[iCont2] == null)
                {
                    Carro2[iCont2] = new clsCarrosProp();
                    Carro2[iCont2].StrAnoModelo = txtAnoModelo1.Text;
                    Carro2[iCont2].StrCor = txtCor1.Text;
                    Carro2[iCont2].StrFabricante = txtFabricante1.Text;
                    Carro2[iCont2].StrModelo = txtModelo1.Text;
                    break;
                }
                else if(iCont2 == clsDefinicoes1.iMaxNumCarros1 - 1)
                {
                    MessageBox.Show("Número máximo de carros atingido.");
                    return;
                }
            }

            vListarCarros1();
            vLimparCampos1();
            txtModelo1.Focus();            
        }

 

 

Formulário de Simulação:

Neste, ao tentar incluir uma linha no DataGridView, a partir dos valores do DataGridView do form de inclusão, dá um exception(O índice estava fora do intervalo. Ele deve ser não-negativo e menor que o tamanho da coleção.

Nome do parâmetro: index

 

Entendi que criei uma instância do form de inclusão e tentei acessar uma linha de um DatagridView vazio. é isso????

 

 


    public partial class frmSelecionarCarro : Form
    {
        public frmClasseCarrosProp pfrmClasseCarrosProp = new frmClasseCarrosProp();
        //TORNEI PUBLICO, NO CÓDIGO DO DESIGN DO FORM DE INCLUSAO OS SEGUINTES OBJETOS:
        //public System.Windows.Forms.DataGridView dgvCarros1;
        //public System.Windows.Forms.DataGridViewTextBoxColumn Modelo;
        //public System.Windows.Forms.DataGridViewTextBoxColumn Cor;
        //public System.Windows.Forms.DataGridViewTextBoxColumn Fabricante;
        //public System.Windows.Forms.DataGridViewTextBoxColumn AnoModelo;

        public frmSelecionarCarro()
        {
            InitializeComponent();
        }
        
        private void frmSelecionarCarro_Load(object sender, EventArgs e)
        {
            try
            {
                dgvCarros2.Rows.Add(pfrmClasseCarrosProp.dgvCarros1[0, 0].Value
                                    , pfrmClasseCarrosProp.dgvCarros1[0, 1].Value
                                    , pfrmClasseCarrosProp.dgvCarros1[0, 2].Value
                                    , pfrmClasseCarrosProp.dgvCarros1[0, 3].Value);
            }
            catch (Exception X)
            {
                lblException.Text = X.Message;
            }
        }
        

 

 

2 perguntas sem querer abusar:

 

1°: como faço para acessar objetos de um form em outro, neste caso de um DataGridView para outro???

 

2°: como faço para acessar objetos criados em um form no outro, neste caso os carros inclusos no form de inclusão e carregar eles no DataGridview sem importar do outro DataGridView?

 

Aguardo um help...

 

Antecipadamente grato...

P.S.: Procurei aqui no fórum mais não achei...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rodrigo, não sei se te entendi bem, mas vou tentar te dar uma luz...

 

Quando você chama o formulário de simulação, clicando num botão ou algo parecido, você deve estar executando algo assim...

 

frmSimulacao frm = new frmSimulacao();

frm.Show();

 

Se você adicionar mais um linha nesse código...

 

frmSimulacao frm = new frmSimulacao();

frm.Owner = this;

frm.Show();

 

Ele vai mandar a própria instância do formulário que voce está (frmSelecionarCarro) para o formulário de simulação.

Ao fazer isso, você já vai ter acesso aos objetos do formulário de carro no formulário de simulação. Desse jeito...

 

((frmSelecionarCarro)this.Owner).dgvCarros1

 

Lembrando que é necessário que você faça esse "Cast" (coloque o tipo certo na frente da variável), pois se não fizer, você só vai ter acesso aos objetos padrões que existem num formulário, e não nos objetos que voce colocou ao criar o formulário específico.

 

Espero ter ajudado.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.