none
Como atualizar o componente chart em tempo de execução? RRS feed

  • Pergunta

  • Estou criando um programa onde o usuário insere registros de diferentes eventos em uma tabela. Ele deve inserir o tipo de evento que ocorreu e a sua data. Em uma pesquisa é possível filtrar por um período entre duas datas para se obter quais eventos ocorreram e quantas vezes cada um se repetiu neste período. Também há a possibilidade de se gerar um gráfico onde são exibidos os eventos pela quantidade de vezes que se repetiu. Ou seja, o intuito principal do gráfico é indicar quais foram os eventos que mais se repetiram no período filtrado. Estou usando um banco de dados Access e o gráfico está sendo gerado através do componente chart.

    O programa aparentemente está pegando os dados da tabela no momento em que é executado, mas durante a sua execução, mesmo que seja feita uma nova pesquisa, ao executar o comando que abre o form do gráfico, ele exibe  no chart os mesmos dados que estavam na tabela antes da alteração. 

    Por exemplo:

    Ao filtrar entre as datas de 01/01/2015 e 31/12/2015 obtive os seguintes resultados: evento1: 5 ocorrências, evento2: 1 ocorrência, evento3: 7 ocorrências, evento4: 9 ocorrências.

    A minha tabela mostrada através de um datagridview exibe os resultados corretamente. Mas o componente  chart que deveria mostrar o gráfico com os mesmos resultados acaba exibindo os valores que estavam nessa tabela antes do programa ser executado. Ou seja, para eu ver o resultado da pesquisa que fiz acima, tenho que fechar o programa e abir novamente. Se eu fizer outra pesquisa durante a execução do programa e tentar gerar o gráfico, ele vai continuar mostrando os mesmos dados da pesquisa que foi feita antes dele ser fechado antes.

    Ao consultar a tabela vejo que ela sempre é atualizada a cada pesquisa feita pelo programa. Por isso estou desconfiado que isso esteja ocorrendo porque o TableAdapter pega os dados do banco de dados no início da execução do programa, mas não atualiza em tempo real.

    Tentei os comandos chart.Invalidade(); e chart.Update(); mas também não obtive sucesso.

    O que mais eu poderia tentar?

    Desde já agradeço!



    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Data.OleDb;
    
    namespace FrmtabGraf
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                // TODO: This line of code loads data into the 'lojaDataSet.Dados' table. You can move, or remove it, as needed.
                //this.dadosTableAdapter.Fill(this.lojaDataSet.Dados);
    
            }
    
            void FillTable1()
            {
                Conexao ca = new Conexao();
                string sql = "";
                sql += " Insert Into Dados ";
                sql += " (Descricao, Quantidade) ";
                sql += " Select  ";
                sql += " d.Defeito, COUNT(d.Defeito) AS quantidade  ";
                sql += " From   ";
                sql += " (SisIndice s INNER JOIN   ";
                sql += " Defeitos d ON s.idDefeito = d.idDefeito) ";
                sql += " WHERE (s.DataFat BETWEEN  ";
                sql += " #" + "01/01/2001" + "#  ";
                sql += " AND  ";
                sql += " #" + "31/12/2006" + "#)  ";
                sql += "  GROUP BY d.Defeito ";
                ca.Conectar();
                OleDbCommand cd = new OleDbCommand(sql, ca.cx);
                try
                {
                    cd.ExecuteNonQuery();
                }
                catch (OleDbException x)
                {
                    MessageBox.Show(x.Message);
                }
                ca.Desconectar();
            }
    
            void FillTable2()
            {
                Conexao ca = new Conexao();
                string sql = "";
                sql += " Insert Into Dados ";
                sql += " (Descricao, Quantidade) ";
                sql += " Select  ";
                sql += " d.Defeito, COUNT(d.Defeito) AS quantidade  ";
                sql += " From   ";
                sql += " (SisIndice s INNER JOIN   ";
                sql += " Defeitos d ON s.idDefeito = d.idDefeito) ";
                sql += " WHERE (s.DataFat BETWEEN  ";
                sql += " #" + "01/01/2001" + "#  ";
                sql += " AND  ";
                sql += " #" + "31/12/2015" + "#)  ";
                sql += "  GROUP BY d.Defeito ";
                ca.Conectar();
                OleDbCommand cd = new OleDbCommand(sql, ca.cx);
                try
                {
                    cd.ExecuteNonQuery();
                }
                catch (OleDbException x)
                {
                    MessageBox.Show(x.Message);
                }
                ca.Desconectar();
    
            }
            void ReadTable()
            {
    
                Conexao ca = new Conexao();
                string sql = "";
                sql += " Select  ";
                sql += " Quantidade, Descricao  ";
                sql += " From Dados  ";
                ca.Conectar();
                OleDbDataAdapter da = new OleDbDataAdapter(sql, ca.cx);
                DataSet ds = new DataSet();
                da.Fill(ds, "Dados");
    
                dgvTable.DataSource = ds.Tables["Dados"];
                ca.Desconectar();
            }
            void ClearTable()
            {
                Conexao ca = new Conexao();
                string sql = "";
                sql += " Delete * From Dados ";            
                ca.Conectar();
                OleDbCommand cd = new OleDbCommand(sql, ca.cx);
                try
                {
                    cd.ExecuteNonQuery();
                }
                catch (OleDbException x)
                {
                    MessageBox.Show(x.Message);
                }
                ca.Desconectar();
            }
    
    
            private void cmdDados1_Click(object sender, EventArgs e)
            {
                ClearTable();
                FillTable1();
                ReadTable();
                
            }
    
            private void cmdDados2_Click(object sender, EventArgs e)
            {
                ClearTable();
                FillTable2();
                ReadTable();
            }
    
            private void cmdGerarGraf_Click(object sender, EventArgs e)
            {
                this.dadosTableAdapter.Fill(this.lojaDataSet.Dados);
                chartGraf.Invalidate();
                chartGraf.Update();
                chartGraf.DataBind();
                
            }
        }
    }



    • Editado LD_7 quarta-feira, 2 de março de 2016 17:55
    quarta-feira, 2 de março de 2016 13:54

Respostas

  • Coloca isso ai logo abaixo do OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
    adapter.Fill(results);

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:28
    quinta-feira, 3 de março de 2016 14:17
  • Você pode monitorar o Adaptar via Debug.

    Agora o problema parece ser só a acentuação do Descrição

    chartGraf.Series.Clear();
    
    chartGraf.Series.Add("go");
    chartGraf.Series["go"].XValueMember = "Quantidade";
    chartGraf.Series["go"].YValueMembers = "Descricao";
    chartGraf.DataSource = results;
    
    chartGraf.DataBind();
    chartGraf.Show();

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:27
    sexta-feira, 4 de março de 2016 03:09
  • Não necessariamente, o foto é que ele deveria recarregar, pode colocar o seu código ai para eu dar uma olhada como ele ficou?

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:28
    quinta-feira, 3 de março de 2016 22:32
  • Olá, Cesar!

    Além do problema da acentuação em "Descrição" precisei inverter os membros dos eixos. Deste forma funcionou:


    chartGraf.Series["go"].XValueMember = "Descricao";
    chartGraf.Series["go"].YValueMembers = "Quantidade";

    Muito obrigado pelas dicas! Foram muito úteis.

    Grande abraço!!!

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:27
    segunda-feira, 7 de março de 2016 20:14

Todas as Respostas

  • O problema deve ser o this.dadosTableAdapter que não está sendo atualizado no ReadTable().

    Você pode popular o this.lojaDataSet.Dados dentro do ReadTable()

    quinta-feira, 3 de março de 2016 04:47
  • Olá, Cesar!

    Como popular o this.lojaDataSet.Dados dentro do ReadTable()?

    Tentei fazer isso alterando o código do cmdGerarGraf_Click desta forma, mas não deu certo:

    private void cmdGerarGraf_Click(object sender, EventArgs e)
            {
                string sql = "";
                sql += " Select  ";
                sql += " Quantidade, Descricao  ";
                sql += " From Dados  ";
    
                DataTable results = new DataTable();
    
               string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source = C:\\Users\\leandro.damasceno\\Documents\\Visual Studio 2015\\Projects\\FrmtabGraf\\FrmtabGraf\\loja.mdb";
    
                using (OleDbConnection conn = new OleDbConnection(connString))
                {
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    conn.Open();
                    OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
    
    
                    chartGraf.DataSource = results;
                    chartGraf.Series.Clear();
    
                    chartGraf.Series.Add("go");
                    chartGraf.Series["go"].XValueMember = "Quantidade";
                    chartGraf.Series["go"].YValueMembers = "Descrição";
                    
                    chartGraf.DataBind();
                    chartGraf.Show();
                }

    quinta-feira, 3 de março de 2016 13:10
  • Coloca isso ai logo abaixo do OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);
    adapter.Fill(results);

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:28
    quinta-feira, 3 de março de 2016 14:17
  • Oi, Cesar!

    Coloquei, mas o gráfico continua vazio na execução.

    Na configuração visual do chart devo deixar o DataSource como (none), correto?

    quinta-feira, 3 de março de 2016 14:29
  • Não necessariamente, o foto é que ele deveria recarregar, pode colocar o seu código ai para eu dar uma olhada como ele ficou?

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:28
    quinta-feira, 3 de março de 2016 22:32
  • Então, todo o código é o que está nos posts acima mesmo. A princípio eu tinha configurado o chart pela interface gráfica do visual studio, adicionando o datasource e os eixos nas propriedades. Daí depois tentei implementar ele dentro do cmdGerarGraf_Click. A diferença entre os dois casos é que no primeiro a tabela sempre exibia os valores que estavam no banco de dados no momento que o programa era executado, mas se eu alterasse os dados e tentasse gerar o gráfico novamente, os valores não mudavam. Daí tinha que fechar e abrir o programa de novo para aparecerem os novos valores. Na segunda tentativa, onde a configuração do chart é feita dentro do cmdGerarGraf_Click, o gráfico fica sempre vazio.

    Existe algum meio de monitorar o TableAdapter em tempo real? Dessa forma acho que poderia confirmar se o problema é  na configuração ou implementação do chart.

    quinta-feira, 3 de março de 2016 22:57
  • Você pode monitorar o Adaptar via Debug.

    Agora o problema parece ser só a acentuação do Descrição

    chartGraf.Series.Clear();
    
    chartGraf.Series.Add("go");
    chartGraf.Series["go"].XValueMember = "Quantidade";
    chartGraf.Series["go"].YValueMembers = "Descricao";
    chartGraf.DataSource = results;
    
    chartGraf.DataBind();
    chartGraf.Show();

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:27
    sexta-feira, 4 de março de 2016 03:09
  • Olá, Cesar!

    Além do problema da acentuação em "Descrição" precisei inverter os membros dos eixos. Deste forma funcionou:


    chartGraf.Series["go"].XValueMember = "Descricao";
    chartGraf.Series["go"].YValueMembers = "Quantidade";

    Muito obrigado pelas dicas! Foram muito úteis.

    Grande abraço!!!

    • Marcado como Resposta Marcos SJ terça-feira, 8 de março de 2016 20:27
    segunda-feira, 7 de março de 2016 20:14