C# 数据表到图形-使用Points.AddXY或数据绑定
我尝试了以下想法: 来自 我不确定我是否遗漏了一些愚蠢的东西,或者我的情况有所不同 我有一个名为:C# 数据表到图形-使用Points.AddXY或数据绑定,c#,winforms,mschart,C#,Winforms,Mschart,我尝试了以下想法: 来自 我不确定我是否遗漏了一些愚蠢的东西,或者我的情况有所不同 我有一个名为:DataTableUsedToPlotGraph的DataTable。此DataTable包含多个列(例如,temp、time、time\u formatted、foder\u name…) 我想用这个DataTable(X-time列和Y-time列)的两列数据来绘制图表 我尝试的(它说我不仅需要X点,还需要Y点;如果我尝试放置X和Y,则表示:无法从“System.Data.dataTable”转
DataTableUsedToPlotGraph
的DataTable
。此DataTable
包含多个列(例如,temp、time、time\u formatted、foder\u name…)
我想用这个DataTable
(X-time列和Y-time列)的两列数据来绘制图表
我尝试的(它说我不仅需要X点,还需要Y点;如果我尝试放置X和Y,则表示:无法从“System.Data.dataTable”转换为“System.Collections.IEnumerable”):
或
而且,
(不在我的图表中绘制任何内容)
那么
对于数据库访问,我使用以下方法:
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获得大量帮助后,我尝试了,但没有成功(正在显示图形,但没有分数):
注意:如果我使用与“SqlDataReader myReader;”相同的列,它可以正常工作
再尝试一次(显示图形但不显示点):
我添加DGV以查看是否有数据:
this.dataGridView1.DataSource = DataTableUsedToPlotGraph;
this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time");
结果包含数据+列名称以及时间和温度。我将尝试在一些服务器上上传图像。有很多方法可以绑定图表 请参阅各种选项及其各自的优缺点 这里有一个简单的例子:给定一个带有两个合适列的
数据表dt
,“c0”
和“c1”
,您只需编写:
yourChart.Series[yourSeriesIndexOrName].Points.DataBindXY(dt.Rows, "c0", dt.Rows, "c1");
请注意,如果希望在x值中包含日期,最好选择日期并确保表列也是
DateTime
“不工作”不是一个有用的问题描述会发生什么?没有什么?错误?撞车?错误的结果另外:难道你不能至少测试一下你是否实际拥有你想要选择的数据吗?还有:为什么你要把数据转换成字符串?图表应该显示数字;系统将转换y值,但不会转换x值@我编辑了我的问题。我希望这一点现在已经清楚了。此外,我还尝试使ToString()生效,因为如果我不“强制”,我会得到错误“System.Windows.Forms.DataVisualization.dll中发生了类型为'System.ArgumentException'的未处理异常”。如果我使用ToString(),我会传递这个错误-但我同意你的观点,图形只是数字而不是字符串!有时x值是字符串(ID、城市、其他名称);通常它们是日期时间,但y值从来都不是。您可以使用Convert强制转换为实际类型。x值和y值的类型是什么?@TaW,我希望得到时间和温度。在X时间(来自2017年4月26日上午8:53:00或上午8:53的数据表-我在数据表中有两列-我可以使用更容易绘制的列(我更喜欢完整的时间列))。在Y-Temp(温度范围从0到+600 Celcius)中,这看起来非常好,但它没有在我的图表上绘制任何东西。我的图表正在显示,但没有点。我仔细检查DataTable是否包含我想要绘制的字段和信息——信息和列是否正确。奇怪的是,如果我尝试以几乎相同的方式使用数据库作为源,它就会工作。我将用我的结果编辑问题。你可能想添加一个DGV用于测试,并将DataTable作为其数据源。嘿,我刚刚做了,对我来说,这似乎是正确的-数据显示在DGV上,我有几个列,其中两列是数据和时间。你能添加两个的屏幕截图吗,DGV带有一些数据和图表。图表显示了它的轴吗?同时显示您现在使用的DataBindXY..开始吧!它正在工作!我正在清理代码另一部分中的图形!非常感谢。
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);
}
try
{
this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
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);
}
this.dataGridView1.DataSource = DataTableUsedToPlotGraph;
this.ChartTempVsTime.Series["TimeVsTempPoint"].Points.DataBindXY(DataTableUsedToPlotGraph.Rows, "temp", DataTableUsedToPlotGraph.Rows, "time");
yourChart.Series[yourSeriesIndexOrName].Points.DataBindXY(dt.Rows, "c0", dt.Rows, "c1");