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");