DataTable to Graph - 使用 Points.AddXY 或 DataBind
DataTable to Graph - Using Points.AddXY or DataBind
我尝试了以下想法:
and from
我不确定我是否遗漏了一些愚蠢的东西或者我的情况不同。
我有一个 DataTable
名为:DataTableUsedToPlotGraph
。此 DataTable
包含多个列(例如,温度、时间、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");
结果包含数据 + 带有时间和温度的列名。我会尝试在某个服务器上传图片。
图表数据绑定的方法有很多种。
请参阅 MSDN 了解各种选项及其各自的优缺点!
这是一个简单的例子:给定一个 DataTable dt
有两个 suitable 列 "c0"
和 "c1"
你可以简单地写:
yourChart.Series[yourSeriesIndexOrName].Points.DataBindXY(dt.Rows, "c0", dt.Rows, "c1");
请注意,如果您想在 x 值中包含日期,最好是 select 日期并确保 table 列也是 DateTime
。
我尝试了以下想法:
我不确定我是否遗漏了一些愚蠢的东西或者我的情况不同。
我有一个 DataTable
名为:DataTableUsedToPlotGraph
。此 DataTable
包含多个列(例如,温度、时间、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");
结果包含数据 + 带有时间和温度的列名。我会尝试在某个服务器上传图片。
图表数据绑定的方法有很多种。
请参阅 MSDN 了解各种选项及其各自的优缺点!
这是一个简单的例子:给定一个 DataTable dt
有两个 suitable 列 "c0"
和 "c1"
你可以简单地写:
yourChart.Series[yourSeriesIndexOrName].Points.DataBindXY(dt.Rows, "c0", dt.Rows, "c1");
请注意,如果您想在 x 值中包含日期,最好是 select 日期并确保 table 列也是 DateTime
。