2017-07-11 5 views
1

J'ai essayé les idées: Drawing a chart from a datatable et de How To Bind A DataTable To MS ChartDataTable Graphique - L'utilisation Points.AddXY ou DataBind

Je ne suis pas sûr si je manque quelque chose de stupide ou mon cas est différent. J'ai un DataTable nommé DataTableUsedToPlotGraph. Ce DataTable contient plusieurs colonnes (par exemple, temp, time, time_formatted, foder_name ...). Je veux tracer le graphique avec les données de deux colonnes de cette colonne DataTable (colonne X-temps vs colonne Y-time). Ce que j'ai essayé (Il est dit que j'ai besoin non seulement de points X, mais aussi de points Y. Si j'essaie de mettre x et y, je ne peux pas convertir 'System.Data.dataTable' en 'System.Collections.IEnumerable'):

ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBind(DataTableUsedToPlotGraph,"time"); 

ou

ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph,"time", "temp"); 

en outre, (ne trace pas quoi que ce soit dans mon graphique)

this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.AddXY(DataTableUsedToPlotGraphTemp.Columns["time"].ToString(), DataTableUsedToPlotGraphTemp.Columns["temp"].ToString()); 

Ensuite,

DataView dv1 = new DataView(DataTableUsedToPlotGraph); 
DataView dv2 = new DataView(DataTableUsedToPlotGraph); 

dv1.RowFilter = "time"; 
dv2.RowFilter = "temp"; 

ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBind(dv1, "time", "temp, ""); 

Pour l'accès à la base que j'utilise ceci:

try 
{ 
    conDatabase.Open(); 
    myReader = cmdDatabase.ExecuteReader(); 

    while (myReader.Read()) 
    { 
     ChartTempVsTime.Series["TimeVsTempPoint"].MarkerSize = 2; 
     this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.AddXY(myReader["time"].ToString(), myReader["temp"].ToString()); 
    } 
} // end of try 
catch (Exception ex) 
{ 
    MessageBox.Show(ex.Message); 
} 

Mais rien ne fonctionne. Est-ce que quelqu'un sait ce qui me manque?

Après avoir lu et obtenir beaucoup d'aide de @TaW, j'ai essayé, sans succès (le graphique montre, mais sans points):

try 
    { 
     this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time"); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

Note: si j'utilise les mêmes colonnes avec " SqlDataReader myReader; " , ça fonctionne bien.

Une autre tentative (montrant le graphique, mais pas de points):

DataTableReader myReader; 
    try 
    { 
     myReader = DataTableUsedToPlotGraph.CreateDataReader(); 

     while (myReader.Read()) 
     { 
      //ChartTempVsTime.Series["TimeVsTempPoint"].MarkerSize = 2; 
      this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.AddXY(myReader["time"].ToString(), myReader["temp"].ToString()); 

     } 
    } // end of try 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

I Ajouter un DGV pour voir si j'ai données:

this.dataGridView1.DataSource = DataTableUsedToPlotGraph; 
    this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time"); 

les résultats contiennent des données + colonnes nom avec le temps et temp. Je vais essayer de télécharger l'image sur un serveur.

+0

_Ne fonctionne pas_ n'est pas une description de problème utile! - Ce qui se produit? Rien? Les erreurs? Crashes? Mauvais résultats? - Aussi: Vous ne pouvez pas au moins tester pour voir si vous avez acutually les données que vous avez prévu de sélectionner ?? – TaW

+0

Aussi: Pourquoi convertissez-vous les données en chaîne? Les graphiques sont censés afficher des nombres; les valeurs y seront converties par le système mais les valeurs x ne le seront pas! – TaW

+0

@TaW, j'ai édité ma question. J'espère que c'est clairement maintenant. Aussi, j'ai essayé de faire ToString() parce que si je ne force pas, j'obtiens l'erreur "Une exception non gérée de type 'System.ArgumentException' s'est produite dans System.Windows.Forms.DataVisualization.dll". Si j'utilise ToString(), je passe cette erreur - mais je suis d'accord avec vous, les graphiques ne sont que des nombres et non des chaînes! –

Répondre

0

Il existe plusieurs manières de lier des données à un graphique.

Voir MSDN sur les différentes options et leurs avantages et inconvénients respectifs!

Voici un simple: étant donné un DataTable dt avec deux colonnes appropriées "c0" et "c1" vous pouvez simplement écrire:

yourChart.Series[yourSeriesIndexOrName].Points.DataBindXY(dt.Rows, "c0", dt.Rows, "c1"); 

Notez que si vous voulez avoir des dates dans les valeurs x il est préférable de choisir dates et assurez-vous que la colonne de la table est également DateTime.

+0

Cela a l'air vraiment sympa mais ça ne représente rien sur mon graphique. Mon graphique montre mais sans points. Je vérifie pour voir si le DataTable contient les champs et les informations que je veux tracer - les informations et les colonnes sont correctes. Ce qui est étrange, c'est que si j'essaie presque de la même manière avec Data Base comme source, ça fonctionne. Je vais modifier les questions avec mes résultats. –

+0

Vous voudrez peut-être ajouter un DGV pour tester et lui donner le DataTable comme source de données .. – TaW

+0

Hé, je viens de le faire et pour moi, il semble juste - les données sont affichées sur la DGV et j'ai plusieurs colonnes où 2 d'entre eux sont les données et le temps. –