Ir para conteúdo

Arquivado

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

Gianlucas Almeida

C# Windows Forms: Atualizar dataGridView em tempo real.

Recommended Posts

Olá,
Tudo bom?

Nós temos um projeto, que é multiplataforma.
Muitas(Umas 6) pessoas acessam a mesma informação. Em plataformas diferentes (Web X Desktop X Mobile)

Como eu poderia atualizar em tempo real, ou quase, um datagridview, listview, etc...
Sendo ele populado por um Banco de Dados Mysql.

 

Poderia ser por Threads, Sockets ou WCF (Windows Communication Foundation).
Por favor pessoal.

Faltou isso para apresentar o projeto final.
Obrigado desde Já !


OBS: Já tentei um timer_tick, até que foi, o ruim é que o banco de dados não é local. Todos são direcionados a um servidor.
E imagine dois timers em uma form, consultando o BD.

OBS²: SignalR? Alguém ? rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se você está usando o windows forms, basta iniciar uma thread em segundo plano e preencher a propriedade dataSource com o dataSet retornado dos dados. A atualização é automática.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá !
Tudo bom ?
Obrigado pela resposta.

Então, segue parte do código da thread chamando os métodos de preencher o Listview e DatagridView da minha form.

        public Caixa2()
        {
            InitializeComponent();

            ChamarThread();
        }

        public void ChamarThread()
        {
            System.Threading.ThreadStart ts =
                new System.Threading.ThreadStart(ExecutarThread);
            System.Threading.Thread t =
                new System.Threading.Thread(ts);
            t.IsBackground = true;
            t.Start();
        }

        private void ExecutarThread()
        {
            conta.PreencherListView(lblNumeroConta.Text, listView1);
            caixa.PreencherDatraGridViewDelivery(dGridViewDelivery);

        }

E abaixo segue códigos dos dois métodos:

Preencher listView

public ListView PreencherListView(string numeroConta, ListView listview1)
        {
            ListView result = new ListView();
            try
            {
                if (Banco.conectar_no_banco("banco"))
                {
                    _listview1 = listview1;
                    _numeroConta = numeroConta; 
                    MySqlDataAdapter da = new MySqlDataAdapter();
                  
                    MySqlCommand cmd = new MySqlCommand("SELECT nome, preco, count(produtos.nome) as qntd FROM pedidos, produtos_has_pedidos, produtos where (conta_idconta = ?conta_idconta and Pedidos_idpedidos = idpedidos and produtos_idprodutos = idprodutos ) group by nome", CLS.Banco.conexao);
                    Banco.comando.Parameters.AddWithValue("conta_idconta", numeroConta);
                    Banco.adapter.SelectCommand = cmd;
                    Banco.mDataSet = new DataSet();
                    Banco.mDataSet.Clear();
                    Banco.adapter.Fill(Banco.mDataSet, "pedidos");


                    DataTable dtable = Banco.mDataSet.Tables["pedidos"];

                    listview1.Items.Clear();

                    for (int i = 0; i < dtable.Rows.Count; i++)
                    {
                        DataRow drow = dtable.Rows[i];
                        if (drow.RowState != DataRowState.Deleted)
                        {
                            ListViewItem lvi = new ListViewItem(drow["count(produtos.nome)"].ToString());
                            lvi.SubItems.Add(drow["nome"].ToString());
                            lvi.SubItems.Add(drow["preco"].ToString());
                            listview1.Items.Add(lvi);
                        }
                    }
                    result = null;
                }

                else
                {
                    Banco.Fecha_banco("banco");
                    result = null;
                }
            }
            catch (Exception ex)
            {
                string x = ex.Message;
                result = null;
            }
            return result;
        }

Código do método de preencher o DatagridView:

public DataTable PreencherDatraGridViewDelivery(DataGridView datagridview)
        {
            DataTable result = new DataTable();
            try
            {
                if (Banco.conectar_no_banco("banco"))
                {
                    _categoriaProduto = categoriaProduto;
                    _datagridview = datagridview;
                    Banco.comando = new MySqlCommand("SELECT idPedidos as id, nomeCliente as Cliente, nome as Sabor, tamanho as Tamanho FROM pedidos, produtos_has_pedidos, produtos where ( Pedidos_idpedidos = idpedidos and produtos_idprodutos = idprodutos ) group by nome;", Banco.conexao);
                    Banco.adapter.SelectCommand = Banco.comando;
                    Banco.mDataSet.Clear();
                    Banco.adapter.Fill(Banco.mDataSet, "IdPedidos");
                    datagridview.DataSource = Banco.mDataSet;
                    datagridview.DataMember = "IdPedidos";

                }
                else
                {
                    Banco.Fecha_banco("banco");
                    result = null;
                }
            }
            catch (Exception ex)
            {
                string x = ex.Message;
                result = null;
            }
            return result;
        }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá !
Desculpe, eu postei rapidamente, pois no curso eles cortam a internet sem avisar...

Então, eu vou manualmente inserir coisas na tabela que dou select, conforme código acima. Não acontece nada... É como se o método de buscar não estivesse rodando...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use o timer para iniciar uma thread ou um background worker, e essa thread ou bgw vai fazer o processo de selecionar no banco e atualizar a grid.

 

Procure por backgroundWorker no google.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá !
Então...

Eu chamei esse método "chamarThread" por um timer, mas não funcionou... O Sistema trava. E estou programando em um servidor HP de 16GB...

Obrigado !

O que pode ser ?!, a forma que eu busco no banco ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se o seu timer tiver um tempo muito curto sim, ele vai travar. O ideal é você chamar em processos separados talvez de 10 em 10 segundos ou menos. Tente executar uma só vez o método e ver se ele trava.

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.