【问题标题】:Multi Line Chart多折线图
【发布时间】:2014-03-26 15:50:14
【问题描述】:

我一直在尝试制作一个从数据库中提取数据的多线图。 为了做到这一点,我编写了以下代码来填充图表:

    SqlConnection con1 = new SqlConnection();
    con1.ConnectionString = ConfigurationManager.ConnectionStrings["Removed"].ToString();
    SqlCommand cmd1 = new SqlCommand("SELECT YEAR(Start_Date) AS Year, Month(Start_Date) As Month, Cost, Utility_Type FROM import_Utilities WHERE YEAR(Start_Date) = 2011  AND Utility_Type = 'Water'");
    cmd1.Connection = con1;
    con1.Open();

    SqlDataAdapter da1 = new SqlDataAdapter(cmd1);
    DataTable dt1 = new DataTable();
    da1.Fill(dt1);
    Chart1.DataSource = dt1;

    Chart1.Series["Series2"].XValueMember = "Month";
    Chart1.Series["Series2"].YValueMembers = "Cost";
    Chart1.Legends.Add(new Legend("Default") { Docking = Docking.Right });


    Chart1.DataBind();
    con1.Close();

    SqlConnection con = new SqlConnection();
    con.ConnectionString = ConfigurationManager.ConnectionStrings["Removed"].ToString();
    con.Open();
    SqlCommand cmd = new SqlCommand("SELECT YEAR(Start_Date) AS Year, Month(Start_Date) As Month, Cost, Utility_Type FROM import_Utilities WHERE YEAR(Start_Date) = 2012 AND Utility_Type = 'Water'");
    cmd.Connection = con;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    Chart1.DataSource = dt;
    Chart1.Series["2010"].XValueMember = "Month";
    Chart1.Series["2010"].YValueMembers = "Cost";

    Chart1.DataBind();
    con.Close();

此代码有效,但它有两个数据源,因此只有底部的 sqlconnection 填充到图表中。 我不知道如何解决这个问题,我想他们是解决这个问题的更好方法,但我不知所措。

更新:

使用下面的示例,我最终使用 pivot sql 制作了一个表(见图)。 然后我将我的代码更新为以下内容:

 SqlCommand cmd = new SqlCommand("SELECT * FROM ( SELECT YEAR(Start_Date), CASE MONTH(Start_Date) WHEN 1 THEN 'January' WHEN 2 THEN 'February' WHEN 3 THEN 'March' WHEN 4 THEN 'April' WHEN 5 THEN 'May' WHEN 6 THEN 'June' WHEN 7 THEN 'July' WHEN 8 THEN 'August' WHEN 9 THEN 'September'WHEN 10 THEN 'October' WHEN 11 THEN 'November' WHEN 12 THEN 'December' END as [Month], [Cost] FROM [HousingAccountingReports].[dbo].[import_Utilities] Where [Building] = 'Building B' AND [Utility_Type] = 'Electric') TableDate PIVOT (SUM([Cost]) FOR [Month] IN ([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December] )) PivotTable");
    cmd.Connection = con;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);
    Chart3.DataSource = dt;
    Chart3.Series["Series1"].XValueMember = "Month";
    Chart3.Series["Series1"].YValueMembers = "2010";
    Chart3.Series["Series2"].XValueMember = "Month";
    Chart3.Series["Series2"].YValueMembers = "2011";
    Chart3.Series["Series3"].XValueMember = "Month";
    Chart3.Series["Series3"].YValueMembers = "2012";
    Chart3.DataBind();`

当我运行该页面时,它错误地找不到月份列。如果我添加:
dt.Columns.Add("月"); dt.Columns.Add(“年份”);` 找不到 2010,我如何让我的图表正确导航;他们是我的pivot sql的问题吗?

【问题讨论】:

标签: c# asp.net sql visual-studio charts


【解决方案1】:

我昨天回答了一个类似的问题。 Separating Chart Series

您不能在不重置数据的情况下更改图表数据源,就像在上面的代码中所做的那样。

就像昨天的问题一样,我建议您先创建一个数据表,然后将数据表中的列引用到您的特定系列

昨天的回答

因此,作为清理代码的建议,我将执行以下操作

  1. 获取 2 个数据表
  2. 以“Month”为主键合并数据表
  3. 将每一列作为新系列添加到图表中

或者您可以手动绘制系列

所以放弃

Chart1.DataSource = dt
Chart1.Series["2010"].XValueMember = "Month";
Chart1.Series["2010"].YValueMembers = "Cost";

替换成

For Each row As DataRow In dt1.Rows
     Chart1.Series("Series2").Points.AddXY(row.Item("Month"), row.Item("Cost"))
Next

For Each row As DataRow In dt.Rows
     Chart1.Series("2010").Points.AddXY(row.Item("Month"), row.Item("Cost"))
Next

如果您设法将所有数据放入一个 Datatable 并创建一个包含两个系列的图表,那么您可以执行以下操作

    Dim dt As New DataTable
    dt.Columns.Add("Month", GetType(String))
    dt.Columns.Add("2010", GetType(Integer))
    dt.Columns.Add("2011", GetType(Integer))

    dt.Rows.Add("January", 15, 25)
    dt.Rows.Add("February", 18, 32)
    dt.Rows.Add("March", 12, 34)
    dt.Rows.Add("April", 12, 34)

    Chart1.DataSource = dt
    Chart1.Series(0).XValueMember = "Month"
    Chart1.Series(0).YValueMembers = "2010"

    Chart1.Series(1).XValueMember = "Month"
    Chart1.Series(1).YValueMembers = "2011"

    Chart1.DataBind()

根据您的代码,我的理解应该是这样的:

SqlConnection con = new SqlConnection();
        con.ConnectionString = ConfigurationManager.ConnectionStrings["removed"].ToString();
        con.Open();
        SqlCommand cmd = new SqlCommand("SELECT YEAR(Start_Date) AS Year, Month(Start_Date) As Month, Cost, Utility_Type, Building FROM import_Utilities WHERE YEAR(Start_Date) = 2012 AND YEAR(Start_Date) = 2011 AND Utility_Type = 'Water'");

        cmd.Connection = con;
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

    Chart1.DataSource = dt;
    Chart1.Series(0).XValueMember = "Month";
    Chart1.Series(0).YValueMembers = "2010";

    Chart1.Series(1).XValueMember = "Month";
    Chart1.Series(1).YValueMembers = "2011"

    Chart1.DataBind()

数据表 dt 中应该包含所有数据{因为我都在铭记这两年)(我如何将它绑定到表以便我可以验证)

但是现在它的抱怨系列不能用作一种方法。

我是一个新手程序员,只在空闲时间做这件事,所以请原谅我的简单错误。

我是否需要像您在此处那样设置数据表: Chart1.DataSource = dt; Chart1.Series(0).XValueMember = "月"; Chart1.Series(0).YValueMembers = "2010";

    Chart1.Series(1).XValueMember = "Month";
    Chart1.Series(1).YValueMembers = "2011"

    Chart1.DataBind()

还是根据sql表做的?

【讨论】:

  • 我可以通过将其中一个 sql 命令更改为包括这两年来获取一张表上的所有信息。如果它们都在一张桌子上以执行第 3 步,那么当我填充该系列的年份之间会有什么不同。
  • 我还不了解每个语句,但这看起来像是我需要做的,它不是一个干净的删除和替换,因为如果只是这样做它就不起作用。我需要汇编参考吗?
  • 查看编辑我添加了一个示例... for each 语句将遍历数据表的每一行并使用该行中的数据为系列添加一个点,您需要chart1.series(0).points.clear绘制之前的每个系列,以确保您删除所有以前的数据
  • 好的,我从您对我的答案的编辑中看到 [我最终会回滚] 首先尝试这个,只需执行 Chart1.Series(1).XValueMember = "Month"; Chart1.Series(1).YValueMembers = "Cost";Chart1.DataBind(),它会将所有成本值绘制在一行中。下一步,您需要旋转您的 sql 表或合并两个数据表,以便您的两个不同系列在每年的两个差异列中。 MSchart 无法找出这两行之间的区别,除非您对要绘制的内容非常具体
  • 从来没有做过pivot sql,也没有真正理解表或到达lops。你会发现哪一个更容易学习?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2017-06-24
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多