DataTable to Graph - 使用Points.AddXY或DataBind

时间:2017-07-11 14:47:55

标签: c# winforms mschart

我尝试了以下的想法: Drawing a chart from a datatableHow 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");

结果包含数据+列名称,包含时间和温度。我会尝试在某个服务器上传图像。

1 个答案:

答案 0 :(得分:1)

图表数据绑定的方法有很多种。

有关各种选项及其各自的优缺点,请参阅MSDN

这是一个简单的问题:如果DataTable dt有两个合适的列"c0""c1",您可以简单地写一下:

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

请注意,如果您希望在x值中包含日期,最好选择日期并确保表格列也是DateTime