我尝试了以下的想法: Drawing a chart from a datatable和How To Bind A DataTable To MS Chart
我不确定我是否遗漏了一些愚蠢的事情,或者我的情况有所不同。
我有DataTable
名为:DataTableUsedToPlotGraph
。此DataTable
包含多个列(例如,temp,time,time_formatted,foder_name ...)。
我想用这个DataTable
的两列数据绘制图表(X时间列与Y时间列)。
我尝试了什么(它说我不仅需要X点而且需要Y点;如果我试图把x和y说成:不能从'System.Data.dataTable'转换为'System.Collections.IEnumerable') :
ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBind(DataTableUsedToPlotGraph,"time");
或
ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph,"time", "temp");
另外, (不会在我的图表中绘制任何内容)
this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.AddXY(DataTableUsedToPlotGraphTemp.Columns["time"].ToString(), DataTableUsedToPlotGraphTemp.Columns["temp"].ToString());
然后,
DataView dv1 = new DataView(DataTableUsedToPlotGraph);
DataView dv2 = new DataView(DataTableUsedToPlotGraph);
dv1.RowFilter = "time";
dv2.RowFilter = "temp";
ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBind(dv1, "time", "temp, "");
对于数据库访问,我使用:
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);
}
但没有任何效果。有人知道我错过了什么吗?
在阅读并获得@TaW的大量帮助之后,我尝试了,没有成功(图表显示但没有分数):
try
{
this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
注意:如果我使用与“SqlDataReader myReader;”相同的列,它工作正常。
再一次尝试(显示图表但没有点):
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);
}
我添加一个DGV以查看我是否有数据:
this.dataGridView1.DataSource = DataTableUsedToPlotGraph;
this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time");
结果包含数据+列名称,包含时间和温度。我会尝试在某个服务器上传图像。
答案 0 :(得分:1)
图表数据绑定的方法有很多种。
有关各种选项及其各自的优缺点,请参阅MSDN!
这是一个简单的问题:如果DataTable dt
有两个合适的列"c0"
和"c1"
,您可以简单地写一下:
yourChart.Series[yourSeriesIndexOrName].Points.DataBindXY(dt.Rows, "c0", dt.Rows, "c1");
请注意,如果您希望在x值中包含日期,最好选择日期并确保表格列也是DateTime
。