【问题标题】:ASP.NET Chart control multiple series databindingASP.NET图表控件多系列数据绑定
【发布时间】:2011-06-09 22:05:16
【问题描述】:

以下表为例:

   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 选择 V​​alueA 和 ValueB 的任意组合,并在图表上显示适当数量的系列。这可能吗?如果可能,我的方法的哪一部分不正确?

根据进一步的检查,我认为当为 Item1 选择 V​​alueA 并为 Item2 选择 V​​alueB 时出现错误的原因以及仅返回最后一个选定项目的结果的原因是 sqlDataSource.SelectCommand 具有最后一个值这是在 foreach 循环中设置的,用于最后一个选定的项目。

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

【问题讨论】:

    标签: asp.net data-binding charts


    【解决方案1】:

    想通了。

    我没有使用正确的数据绑定方法来获得我想要的结果。

    要以我想要的方式填充每个系列中的数据,需要使用 Series.AddXY() 方法和数据读取器对象。

    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 选择 V​​alueA 和 Value B 的任意组合,并正确获取图表上的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多