none
Duvidas com o Chart C#? RRS feed

  • Pergunta

  • Olá Pessoal, tenho uma grande duvida há muito tempo referente ao chart do C#.

    É o seguinte, montei um gráfico que mostra a quantidade de clientes cadastrados a cada mês como o da imagem:

    sábado, 6 de junho de 2015 16:47

Respostas

  • Rafael, 

    No contexto da thread que você linkou, é uma classe criada pelo autor do código postado, que provavelmente herda de outra classe, embora não possa ser confirmado uma vez que não é código do .NET Framework, e sim de autoria independente. Se você olhar, essa classe possui um método GetDataSet(). Se você procurar por esse método, descobrirá que ele faz parte da classe DataRelationCollection, no namespace System.Data. Segue a documentação:

    System.Data.DataRelationCollection

    De qualquer forma, a descrição do método na documentação leva a entender que clsDB é uma classe de base de dados de autoria de quem postou código. O que ela faz é retornar um dataset a partir de uma query executada na base de dados.

                string query = @"SELECT distinct FUNC.Nome, sum(PED.valor1+PED.valor2+PED.valor3+PED.valor4+PED.valor5) as Valor
                                     FROM tab_funcionario as FUNC
                                        left join tab_pedido as PED 
                                           on(PED.id_func = FUNC.id_funcionario)
                                                      where DataHora between '"+dt_ini+"' and '"+dt_fim+"' group by FUNC.Nome ";
    
                // Create data object, parse query string and fetch DS
                clsDB DBWork = new clsDB();
                DataSet DS1 = new DataSet();
                DS1 = DBWork.GetDataSet(query);

    A variável query é passada como parametro para o método GetDataSet, que retorna um DataSet atribuído a variável do mesmo tipo DS1. Tudo isso baseado na minha interpretação do contexto, então pode ser que seja diferente.

    O código abaixo é um exemplo de um código para retornar um dataset de uma base de dados SQL server, retirado desta thread do stackoverflow:

    public System.Data.DataSet GetDataSet(string sqlStatement, System.Data.SqlClient.SqlConnection connection)
    {
    
    System.Data.DataSet functionReturnValue = default(System.Data.DataSet);
    if (connection == null) {
        throw new ArgumentNullException("connection");
    }
    
    System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
    System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter();
    System.Data.DataSet dset = new System.Data.DataSet();
    
    try {
        //   Connect to the database
        if (connection.State != ConnectionState.Open) {
            connection.Open();
        }
    
        if (connection.State != ConnectionState.Open) {
            throw new MyCustomException("Connection currently {0} when it should be open.", connection.State));
        }
    
        //   Create a command connection
        cmd = new System.Data.SqlClient.SqlCommand();
        {
            cmd.Connection = connection;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlStatement;
        }
        //.ExecuteReader()        'Forward only Dataset
    
        //   Create a data adapter to store the inforamtion
        adp = new System.Data.SqlClient.SqlDataAdapter();
        dset = new DataSet();
        {
            adp.SelectCommand = cmd;
            adp.Fill(dset, "Results");
        }
    
        //   Return the resulting dataset to the calling application
    
        functionReturnValue = dset;
    }
    catch (System.Data.SqlClient.SqlException objSE) {
        functionReturnValue = null;
        //   Let the calling function known they stuffed up and give them the SQL to help out.
        throw new JDDataException(System.String.Format("SQL :- {0}.", sqlStatement), objSE);
    }
    finally {
        if ((cmd != null)) cmd = null; 
        if ((adp != null)) adp = null; 
        if ((dset != null)) dset = null; 
    }
    return functionReturnValue;

    Espero que isso lhe ajude com seu problema.

    Sucesso!

    • Marcado como Resposta Cristopher C I_ quarta-feira, 10 de junho de 2015 14:01
    quarta-feira, 10 de junho de 2015 13:57

Todas as Respostas

  • porém eu não sei o que fazer para mudar os valores das coordenadas x e y desse gráfico quando o usuário pedir a data pelos dois textBox acima, aí eu queria que o gráfico atualizasse ao clicar no botão pesquisar.

    me disseram pra usar isto:

                chart1.ChartAreas["ChartArea1"].AxisX.Minimum =Convert.ToDouble(txtPeriodoDe.Text);
                chart1.ChartAreas["ChartArea1"].AxisX.Maximum = Convert.ToDouble(txtAte.Text);

    mas creio que tem haver com Series ou algo parecido com isso.

    minha query é a seguinte :

    string query = @"SELECT mes_ano, total FROM CadastradosMes WHERE(mes_ano = '" + txtPeriodoDe.Text + "' order by mes";

    mas ainda não sei onde usar o segundo textBox, me ajudem por favor!

    sábado, 6 de junho de 2015 16:52
  • Opa, tudo bom Rafael?

    Deixa eu ver se eu entendi seu problema. você quer limitar o seu gráfico através da dimensão X que representa um intervalo de tempo? a solução que te foi passada devia atender essa demanda. qual o problema que você está tendo? é em retornar os valores corretos? Ou o chart não atualiza?

    terça-feira, 9 de junho de 2015 19:05
  • Olá Rafael, tudo bom?

    No Click no botão pesquisar tente converter o texto para um DateTime e em seguida chame o ToOADate(). Ficará assim:

    chart1.ChartAreas["ChartArea1"].AxisX.Minimum = Convert.ToDateTime(txtPeriodoDe.Text).ToOADate();
    chart1.ChartAreas["ChartArea1"].AxisX.Maximum = Convert.ToDateTime(txtAte.Text).ToOADate();

    Abraço

    • Sugerido como Resposta Samuel Pelaquim sexta-feira, 12 de junho de 2015 12:22
    quarta-feira, 10 de junho de 2015 05:26
  • Sim, deve ser isso mesmo, mas onde vai a query nisso tudo?

    pq sem a query ele vai atualizar um chart em branco.

    quarta-feira, 10 de junho de 2015 12:01
  • No caso eu só quero atualizar a coordenada X, que é a que mostra a data, Porém o gráfico atualiza em branco, ele não exibe mais a barra laranja do gráfico.

    tipo, se eu colocar no txtPeriodoDe.text = 2015/04

    e no txtAte.text = 2015/12

    eu só quero que o gráfico exiba a barra do mes 4,5,6,7,8,9,10,11 e 12.

    é um filtro.Entendeu?

    quarta-feira, 10 de junho de 2015 12:21
  • por favor deem uma olhada nessa dúvida, é isso o que quero fazer, é atualizar o gráfico com uma query, porém eu não consegui entender o que é 
     clsDB DBWork = new clsDB();
    https://social.msdn.microsoft.com/Forums/vstudio/pt-BR/ab8eab69-dd64-4e74-8959-373b6a847f50/atualizar-grfico-chart-com-uma-query?forum=vscsharppt
    quarta-feira, 10 de junho de 2015 12:27
  • Rafael, 

    No contexto da thread que você linkou, é uma classe criada pelo autor do código postado, que provavelmente herda de outra classe, embora não possa ser confirmado uma vez que não é código do .NET Framework, e sim de autoria independente. Se você olhar, essa classe possui um método GetDataSet(). Se você procurar por esse método, descobrirá que ele faz parte da classe DataRelationCollection, no namespace System.Data. Segue a documentação:

    System.Data.DataRelationCollection

    De qualquer forma, a descrição do método na documentação leva a entender que clsDB é uma classe de base de dados de autoria de quem postou código. O que ela faz é retornar um dataset a partir de uma query executada na base de dados.

                string query = @"SELECT distinct FUNC.Nome, sum(PED.valor1+PED.valor2+PED.valor3+PED.valor4+PED.valor5) as Valor
                                     FROM tab_funcionario as FUNC
                                        left join tab_pedido as PED 
                                           on(PED.id_func = FUNC.id_funcionario)
                                                      where DataHora between '"+dt_ini+"' and '"+dt_fim+"' group by FUNC.Nome ";
    
                // Create data object, parse query string and fetch DS
                clsDB DBWork = new clsDB();
                DataSet DS1 = new DataSet();
                DS1 = DBWork.GetDataSet(query);

    A variável query é passada como parametro para o método GetDataSet, que retorna um DataSet atribuído a variável do mesmo tipo DS1. Tudo isso baseado na minha interpretação do contexto, então pode ser que seja diferente.

    O código abaixo é um exemplo de um código para retornar um dataset de uma base de dados SQL server, retirado desta thread do stackoverflow:

    public System.Data.DataSet GetDataSet(string sqlStatement, System.Data.SqlClient.SqlConnection connection)
    {
    
    System.Data.DataSet functionReturnValue = default(System.Data.DataSet);
    if (connection == null) {
        throw new ArgumentNullException("connection");
    }
    
    System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
    System.Data.SqlClient.SqlDataAdapter adp = new System.Data.SqlClient.SqlDataAdapter();
    System.Data.DataSet dset = new System.Data.DataSet();
    
    try {
        //   Connect to the database
        if (connection.State != ConnectionState.Open) {
            connection.Open();
        }
    
        if (connection.State != ConnectionState.Open) {
            throw new MyCustomException("Connection currently {0} when it should be open.", connection.State));
        }
    
        //   Create a command connection
        cmd = new System.Data.SqlClient.SqlCommand();
        {
            cmd.Connection = connection;
            cmd.CommandType = CommandType.Text;
            cmd.CommandText = sqlStatement;
        }
        //.ExecuteReader()        'Forward only Dataset
    
        //   Create a data adapter to store the inforamtion
        adp = new System.Data.SqlClient.SqlDataAdapter();
        dset = new DataSet();
        {
            adp.SelectCommand = cmd;
            adp.Fill(dset, "Results");
        }
    
        //   Return the resulting dataset to the calling application
    
        functionReturnValue = dset;
    }
    catch (System.Data.SqlClient.SqlException objSE) {
        functionReturnValue = null;
        //   Let the calling function known they stuffed up and give them the SQL to help out.
        throw new JDDataException(System.String.Format("SQL :- {0}.", sqlStatement), objSE);
    }
    finally {
        if ((cmd != null)) cmd = null; 
        if ((adp != null)) adp = null; 
        if ((dset != null)) dset = null; 
    }
    return functionReturnValue;

    Espero que isso lhe ajude com seu problema.

    Sucesso!

    • Marcado como Resposta Cristopher C I_ quarta-feira, 10 de junho de 2015 14:01
    quarta-feira, 10 de junho de 2015 13:57
  • Então deixa eu ver se eu entendi.

    eu deveria então criar uma classe chamada  clsDB e adotar pra ela o método GetData, ou o nome da minha classe deve se chamar DBwork(o que seria o DBwork?)???????

    obrigado por estar tentando me ajudar! :)

    quinta-feira, 11 de junho de 2015 13:12
  • Rafael,

    Dá uma lida nos links e no código que eu passei no post acima. Você precisa criar uma classe que vai fazer acesso a base de dados e te retornar a informação que você precisa para popular seu chart. O nome que você vai dar fica a seu critério ^^

    Att,

    quinta-feira, 11 de junho de 2015 17:38
  • Pelo que vi, seu  gráfico já está funcionando, porém sem o filtro. Colocando as duas linhas que te disse após carregar o gráfico já vai funcionar de acordo com o desejado.
    quinta-feira, 11 de junho de 2015 19:04
  • Certo, porém eu sei que tenho que adicionar as referencias o using System.Data.Sql

    mas ainda ele esta pedindo mas referencias e eu não conheço.está dando erro nas seguintes partes desta classe:

    if (connection.State != ConnectionState.Open) --> //ConnectionState.Open não existe

    throw new MyCustomException("Connection currently {0} when it should be open.", connection.State); ---> //MyCustomException não existe

    cmd.CommandType = CommandType.Text --> o CommandType.Text não existe

    JDDataException --> não existe

    porque estou com esses erros? creio que devo importar alguma referencia mas qual(is)?


    sexta-feira, 12 de junho de 2015 14:19
  • tudo bem com o código, ta certinho, mas o problema é que o gráfico esta atualizando em branco!!!
    segunda-feira, 15 de junho de 2015 11:54