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!
Segue o código genérico do formulário que estou usando para testes:
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();
}
}
}