ASP.NET Chart控制多个系列数据绑定

时间:2011-06-09 22:05:17

标签: asp.net data-binding charts

使用下表作为示例:

   TimeStamp          ValueA ValueB Name
   5/1/2011 12:00:00  100    150    Item1 
   5/1/2011 12:00:00  101    151    Item2 
   5/1/2011 12:10:00  110    160    Item1 
   5/1/2011 12:10:00  111    151    Item2 
   5/1/2011 12:20:00  102    170    Item1 
   5/1/2011 12:00:00  112    171    Item2 

我有一个Treeview,Item1和Item2作为节点,每个节点都可以选择ValueA和ValueB:

Item1
    -ValueA
    -ValueB
Item2
    -ValueA
    -ValueB

当用户选择ValueA或ValueB时,它应该作为一个系列添加并显示在图表上。

数据显示正确,但仅适用于最后检查的ItemX。如果您在树视图上检查Item1-> ValueA然后选择Item2-> ValueA,那么使用系列下面的代码更新图表只会显示Item2的ValueA

SqlDataSource sqlDataSource = new SqlDataSource();
            sqlDataSource.ID = "SQLDataSourceChart";

            foreach (TreeNode node in TagTreeView.CheckedNodes)
            {
                // Add a series to the chart
                Series series = Chart1.Series.Add("Series" + node.Value);
                series.ChartArea= "ChartArea1";
                series.ChartType = (SeriesChartType)Enum.Parse(typeof(SeriesChartType), charts[1], true);

                sqlDataSource.ConnectionString = ConfigurationManager.ConnectionStrings["HistoricalDataConnectionString"].ConnectionString;

                if (node.Depth > 1)
                {
                    sqlDataSource.SelectCommand = @"SELECT "+ node.Value + " [ExampleTable] WHERE [Name] = '" + node.Parent.Text + "' ORDER BY TimeStamp";

                    this.Page.Controls.Add(sqlDataSource);
                    Chart1.DataSourceID = "SQLDataSourceChart";

                    Chart1.Series["Series" + node.Value].XValueMember = "TimeStamp";
                    Chart1.Series["Series" + node.Value].YValueMembers = node.Value;

                }
            }
            Chart1.DataBind();

我想我不清楚如何将系列添加到图表中。我最初的假设是系列被添加到图表中,其名称基于node.Value,当处理foreach循环时给出一系列列表,然后将其添加到数据绑定表的图表中。

似乎正在发生的是,所有系列都基于图例,只有树视图中最后一个选定项目的数据在图表中可见。

我最终想要发生的是用户可以为Item1或Item2选择ValueA和ValueB的任意组合,并在图表上显示相应数量的系列。这是可能的,如果是的话,我的方法的哪一部分是不正确的?

根据进一步的检查,我认为我为Item1选择ValueA和Item2的ValueB时得到错误的原因以及仅为最后选择的项返回结果的原因是sqlDataSource.SelectCommand具有最后一个值这是在foreach循环中设置的,它将用于最后选择的项目。

有没有办法将sqlDataSource绑定到特定系列,或者为每个系列提供一个单独的查询,当数据绑定到图表时,每个系列都会看到正确的查询?

1 个答案:

答案 0 :(得分:3)

想出来。

我没有使用正确的数据绑定方法来实现我正在寻找的结果。

按照我想要的方式填充每个系列中的数据需要使用Series.AddXY()方法和datareader对象。

Series series = Chart1.Series.Add(node.Parent.Text + "-" + node.Value);
                series.ChartArea= "ChartArea1";
                series.ChartType = (SeriesChartType)Enum.Parse(typeof(SeriesChartType), charts[1], true);


                SqlConnection sqlConnection = new SqlConnection(connectionStringDefinedElsewhere);

                if (node.Depth > 1)
                {
                    sqlConnection.Open();
                    SqlCommand nodeQuery = new SqlCommand("SELECT (Date + CONVERT(datetime,Time)) As TimeStamp," + node.Value + ", [ItemID] FROM EquipmentData WHERE [ItemID] = '" + node.Parent.Text + "' ORDER BY TimeStamp", sqlConnection);

                    SqlDataReader reader = nodeQuery.ExecuteReader();
                    while (reader.Read())
                    {

                        int value = (int)reader[node.Value];
                        DateTime TimeStamp = (DateTime)reader["TimeStamp"];

                        series.Points.AddXY(TimeStamp, value);
                    }
                    sqlConnection.Close()
                }
            }
            Chart1.DataBind();

使用此方法,您可以为Item1和Item2选择ValueA和Value B的任意组合,并正确获取图表上的数据。