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

问题描述

| 以下表为例:
   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 
我有一个树视图,其中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();
我想不清楚该系列如何添加到图表中。我最初的假设是,在处理foreach循环时,会将系列添加到具有基于node.Value的名称的图表中,从而给出一系列列表,然后将其添加到数据绑定上的图表中。 似乎正在发生的事情是,所有系列都基于图例,只有树视图中最后选择的项目的数据在图表中可见。 最后,我想让用户为Item1或Item2选择ValueA和ValueB的任意组合,并在图表上显示适当数量的系列。这可能吗?如果可以,我的方法的哪一部分是不正确的? 根据进一步的检查,我认为为Item1选择ValueA而为Item2选择ValueB时出现错误的原因以及仅针对最后一个选定项目返回结果的原因是sqlDataSource.SelectCommand具有最后设置的值在foreach循环中,该循环将用于最后选择的项目。 有没有一种方法可以将sqlDataSource绑定到特定系列,或者为每个系列提供一个单独的查询,以便在将数据绑定到图表时每个系列都能看到正确的查询?     

解决方法

        弄清楚了。 我没有使用正确的数据绑定方法来获得所需的结果。 要按照我想要的方式填充每个系列中的数据,需要使用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的任意组合,并正确获取图表上的数据。