• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

rjcp

Como fazer refresh de uma datagrid no form1 a partir do form2?

14 mensagens neste tópico

Olá a todos

Uma vez mais recorro aos conhecimentos de quem mais domina isto para ver se consigo desvendar este "mistério".

Como posso fazer refresh/reload/update de uma datagrid que está no form1 a partir do form2?

Obrigado desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Uma hipotese é teres uma função no formulário que contem a grid... e poes lá o código para fazer o refresh. Depois do outro formulário fazes algo do tipo form1.FuncaoRefresh().

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas entao será mais facil mostrares o que tens feito ... pra te podermos ajudar!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Form2 é lançado pelo Form1? Se não for acho que podes ter o problemas do confinamento a Thread que é dado para a UI em Windows Forms.

Tenta explicar melhor que que fizeste e porque não resultou :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ora bem, o que se passa é que eu pretendo fazer um gestor de stocks e após adicionar um produto através de um FormAdicionarProduto e após clicar em OK, quero que a datagrid (que está no MainForm) seja actualizada.

O FormAdicionarProduto é chamado pelo MainForm.

Como já disse num dos posts anteriores, fiz uma função reloadDatagrid que é pública (sei que não convém muito mas neste caso creio que tem de ser mesmo assim) para que seja reconhecida no FormAdicionarProduto. De facto, ela é reconhecida mas, ao clicar no Botão OK do FormAdicionarProduto,  a datagrid do MainForm não é actualizada :P

Espero ter sido suficientemente claro.

Obrigado pelo vosso tempo.

Ricardo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pela 2ª vez... poe o código que tens e que não te está a funcionar para te podermos ajudar!!!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim com codigo era mais facil ajudar.

Estas a usar dataset para ires armazenado os dados ? ou colocas directamente os dados na grid ?

Se estas a usar datasets a grid é automaticamente "refrescada" (  :P  sempre quis usar este termo em português  :)  ).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então cá vai o código do FormAdicionarProduto:

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

namespace GestorDeStocks
{
    public partial class AdicionarProduto : Form
    {
        public AdicionarProduto()
        {
            InitializeComponent();
        }

        private bool isNumeric(string stringToCheck)
        {
            System.Text.RegularExpressions.Regex _isNumber =
                        new System.Text.RegularExpressions.Regex
                        (@"(^[-+]?\d+(,?\d*)*\.?\d*([Ee][-+]\d*)?$)|(^[-+]?\d?(,?\d*)*\.\d+([Ee][-+]\d*)?$)");
            return _isNumber.Match(stringToCheck).Success;
        }

        private void BtnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void BtnAdicionar_Click(object sender, EventArgs e)
        {
            if (textBoxCodigo.Text == null || textBoxCodigo.Text == "") 
            {
                DialogResult drCodigo = MessageBox.Show("Erro na base de dados. Contacte a manutenção!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Error);
                if (drCodigo == DialogResult.OK)
                {
                    this.Close();
                }
            }
            else
                if (textBoxNome.Text == null || textBoxNome.Text == "")
                {
                    DialogResult drNome = MessageBox.Show("Por favor, preencha o campo 'Nome'!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    if (drNome == DialogResult.OK)
                    {
                        return;
                    }
                }
                else
                    if (textBoxQuantidade.Text == null || textBoxQuantidade.Text == "")
                    {
                        DialogResult drQuantidade = MessageBox.Show("Por favor, preencha o campo 'Quantidade'!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        if (drQuantidade == DialogResult.OK)
                        {
                            return;
                        }
                    }
                    else 
                    {
                        if (isNumeric(textBoxQuantidade.Text.ToString()) == false)
                        {
                            DialogResult drQuantidade = MessageBox.Show("Por favor, coloque apenas dígitos no campo 'Quantidade'!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            if (drQuantidade == DialogResult.OK)
                            {
                                return;
                            }
                        }
                    }
                    if (comboBoxDia.Text == "dd" || ((comboBoxDia.Text != "1") && (comboBoxDia.Text != "2") && (comboBoxDia.Text != "3") && (comboBoxDia.Text != "4") &&
                            (comboBoxDia.Text != "5") && (comboBoxDia.Text != "6") && (comboBoxDia.Text != "7") && (comboBoxDia.Text != "8") && (comboBoxDia.Text != "9") &&
                            (comboBoxDia.Text != "10") && (comboBoxDia.Text != "11") && (comboBoxDia.Text != "12") && (comboBoxDia.Text != "13") && (comboBoxDia.Text != "14") &&
                            (comboBoxDia.Text != "15") && (comboBoxDia.Text != "16") && (comboBoxDia.Text != "17") && (comboBoxDia.Text != "18") && (comboBoxDia.Text != "19") &&
                            (comboBoxDia.Text != "20") && (comboBoxDia.Text != "21") && (comboBoxDia.Text != "22") && (comboBoxDia.Text != "23") && (comboBoxDia.Text != "24") &&
                            (comboBoxDia.Text != "25") && (comboBoxDia.Text != "26") && (comboBoxDia.Text != "27") && (comboBoxDia.Text != "28") && (comboBoxDia.Text != "29") &&
                            (comboBoxDia.Text != "30") && (comboBoxDia.Text != "31")))
                        {
                            DialogResult drDia = MessageBox.Show("Por favor, preencha o campo 'Dia' da Validade!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            if (drDia == DialogResult.OK)
                            {
                                return;
                            }
                        }
                        else
                            if (comboBoxMes.Text == "mm" || ((comboBoxMes.Text != "1") && (comboBoxMes.Text != "2") && (comboBoxMes.Text != "3") && (comboBoxMes.Text != "4") &&
                                (comboBoxMes.Text != "5") && (comboBoxMes.Text != "6") && (comboBoxMes.Text != "7") && (comboBoxMes.Text != "8") && (comboBoxMes.Text != "9") &&
                                (comboBoxMes.Text != "10") && (comboBoxMes.Text != "11") && (comboBoxMes.Text != "12"))) 
                            {
                                DialogResult drMes = MessageBox.Show("Por favor, preencha o campo 'Mês' da Validade!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                if (drMes == DialogResult.OK)
                                {
                                    return;
                                }
                            }
                            else
                                if (comboBoxAno.Text == "aaaa" || ((comboBoxAno.Text != "2008") && (comboBoxAno.Text != "2009") && (comboBoxAno.Text != "2010") && (comboBoxAno.Text != "2011") &&
                                    (comboBoxAno.Text != "2012") && (comboBoxAno.Text != "2013") && (comboBoxAno.Text != "2014") && (comboBoxAno.Text != "2015") && (comboBoxAno.Text != "2016") &&
                                    (comboBoxAno.Text != "2017") && (comboBoxAno.Text != "2018") && (comboBoxAno.Text != "2019") && (comboBoxAno.Text != "2020")))
                                {
                                    DialogResult drAno = MessageBox.Show("Por favor, preencha o campo 'Ano' da Validade!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                    if (drAno == DialogResult.OK)
                                    {
                                        return;
                                    }
                                }
                                else
                                {
                                                        
                                                string dataValidade = comboBoxDia.Text.ToString() + "-" + comboBoxMes.Text.ToString() + "-" + comboBoxAno.Text.ToString();
                                                DateTime dataValidadeDateTime = Convert.ToDateTime(dataValidade);

                                                try
                                                {
                                                    DBWrapper c = new DBWrapper(EasyDb.DatabaseType.Access);
                                                    c.DBUser = "Admin";
                                                    c.Connect(@"GestorStocks.mdb; Jet OLEDB:Database Password=;");
                                                    //c.dbExecQuery("insert into TabelaSocios(numero_socio,nome,morada,codigo_postal,telefone,data_registo) values ('" + textBoxNumSocioNovoSocio.Text.ToString() + "','" + textBoxNomeNovoSocio.Text.ToString() + "','" + textBoxMoradaNovoSocio.Text.ToString() + "','" + textBoxCodigoPostalNovoSocio.Text.ToString() + "','" + textBoxTelefoneNovoSocio.Text.ToString() + "','" + LblDataRegistoInsereNovoSocio.Text.ToString() + "')");
                                                    c.dbExecQuery("insert into TabelaStocks(produto, quantidade, validade) values ('" + textBoxNome.Text.ToString() + "','" + textBoxQuantidade.Text.ToString() + "','" + dataValidadeDateTime + "');");
                                                    c.Close();
                                                    DialogResult drAdicionarProduto = MessageBox.Show("Produto inserido com sucesso.\nPretende inserir mais produtos?", "Gestor de Stocks v1.0", MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                                                    if (drAdicionarProduto == DialogResult.Yes)
                                                    {
                                                        textBoxNome.Text = null;
                                                        textBoxQuantidade.Text = null;
                                                        comboBoxDia.Text = "dd";
                                                        comboBoxMes.Text = "mm";
                                                        comboBoxAno.Text = "aaaa";
                                                        [b]//FAZER AQUI O RELOAD DA DATAGRID DO MAINFORM[/b]
                                                        return;
                                                    }
                                                    else
                                                    {
                                                        textBoxNome.Text = null;
                                                        textBoxQuantidade.Text = null;
                                                        comboBoxDia.Text = "dd";
                                                        comboBoxMes.Text = "mm";
                                                        comboBoxAno.Text = "aaaa";
                                                        [b]//FAZER AQUI O RELOAD DA DATAGRID DO MAINFORM[/b]
                                                        this.Close();
                                                        return;
                                                    }

                                                }
                                                catch (Exception i)
                                                {
                                                    MessageBox.Show("ERRO:\n" + i, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                                    return;
                                                }
                                            }
                                }
                  }
    }

Código do MainForm:

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

namespace GestorDeStocks
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        AdicionarProduto AdicionarProduto = new AdicionarProduto();
        FormCreditos FormCreditos = new FormCreditos();
        RemoverProduto RemoverProduto = new RemoverProduto();

        public void reload_TabelaMainForm()
        {
            TabelaMainForm.Rows.Clear();

            try
            {
                DBWrapper c = new DBWrapper(EasyDb.DatabaseType.Access);
                c.DBUser = "Admin";
                c.Connect(@"GestorStocks.mdb; Jet OLEDB:Database Password=;");
                DBResult dbr = c.dbExecQuery("select * from TabelaStocks order by codigo;");
                DBRow _row = null;
                while ((_row = dbr.FetchAsArray()) != null)
                {
                    string codigo = _row["codigo"];
                    string produto = _row["produto"];
                    string quantidade = _row["quantidade"];
                    string validade = _row["validade"];
                    validade = validade.Substring(0, 10);

                    TabelaMainForm.Rows.Add(codigo, produto, quantidade, validade);
                }
                c.Close();

                if (TabelaMainForm.CurrentRow == null)
                {
                    //MessageBox.Show("Não existem produtos registados!", "Gestor de Stocks", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    LblAvisosEscritos.Text = "Não existem produtos registados!";
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Não foi possível aceder à base de dados. Tente novamente!", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        
        private void adicionarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AdicionarProduto.ShowDialog();
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DialogResult dr = MessageBox.Show("Pretende sair?", "Gestor de Stocks v1.0", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (dr == DialogResult.Yes)
            {
                Application.ExitThread();
            }
        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult dr = MessageBox.Show("Pretende sair?", "Gestor de Stocks v1.0", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
            if (dr == DialogResult.Yes)
            {
                Application.ExitThread();
            }
            else
                if (dr == DialogResult.No)
                {
                    e.Cancel = true;
                }
        }

        private void manualToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                System.Diagnostics.Process.Start("ManualUtilizador.pdf");
            }
            catch (Exception)
            {
                MessageBox.Show("Este ficheiro não existe. Por favor, reinstale a aplicação.", "Gestor de Stocks v1.0", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

        }

        private void acercaDeToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FormCreditos.ShowDialog();
        }

        private void removerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            RemoverProduto.ShowDialog();
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
            reload_TabelaMainForm();
        }
    }
}

Espero que assim consigam perceber melhor.

Obrigado desde já.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem a maneira mais trabalhosa seria

// Acrescentar na classe AdicionarProduto

        pprivate MainForm _parentForm;
        
        public MainForm ParentForm
        {
            get
            {
                return _parentForm;
            }

            set
            {
                _parentForm = value;
            }
        }
        
//Substibutir os comentarios //FAZER AQUI O RELOAD DA DATAGRID DO MAINFORM por

ParentForm.TabelaMainForm.Rows.Add(<variavel com o codigo>, <variavel com o produto>, <variavel com a quantidade>, < variavel com a validade>);

// No Main form

private void adicionarToolStripMenuItem_Click(object sender, EventArgs e)
{
  AdicionarProduto.ShowDialog();
  AdicionarProduto.ParentForm = this;
}

// Colocar a TabelaMainForm como public       

Mas existe uma maneira mais facil. :) É usar os Datasets e estes ligados a Database. So tens que passar os dataset para o form de adicioanr produtos.

E no final enviar os novos registos do dataset para a base de dades.

Vanteagens em relação ao codigo que tens agora são muitas. Não necessitas de estar sempre a aceder a base de dados para escrever os dados sempre que é inserido uma linha. Tens un ganho de performance.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa tarde SKM, obrigado pela ajuda.

Na primeira opção que me dás, a aplicação, depois de carregar no OK após inserir o produto, ele devolve-me o seguinte erro:

System.NullReferenceException: Object Reference not set to an instance of an object :s na linha "ParentForm.TabelaMainForm.Rows.Add(<variavel com o codigo>, <variavel com o produto>, <variavel com a quantidade>, < variavel com a validade>);"

Sabes do que poderá ser? Eu substituí os campos por strings para ver se era alguma coisa a vet com o "textBoxNome.Text.ToString()" etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

So fazendo um debug. Não testei o codigo que enviei.

Exprimenta fazer um debug.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já fiz o debug mas o gajo não se acusa em lado nenhum. Apenas dá aquele erro que mostrei acima...  :wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estas a usar um objecto que não esta inicializado. ou que tem o valor a null.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora