2011-06-09 58 views
4

使用下表作爲一個例子:ASP.NET圖表控制多個系列數據綁定

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 

我與項目1和項目2的每個樹視圖與值a和valueB可選擇節點:

Item1 
    -ValueA 
    -ValueB 
Item2 
    -ValueA 
    -ValueB 

當用戶選擇ValueA或ValueB時,它應該作爲一系列添加並顯示在圖表上。

的數據顯示正常,但只在最後ItemX檢查。如果檢查Item1->值a,然後Item2->值a的樹狀使用該系列下面的代碼將只顯示爲值a項目2

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循環時給出一系列列表,然後將其添加到數據綁定的圖表上。

這似乎是發生的是,所有的系列都基於與僅適用於樹視圖是圖表中可見的最後一個選擇項的數據的傳說。

我想到底發生的是,用戶可以選擇值a和valueB的任意組合對於任何一個項目1或項目2,並有一系列相應的數字顯示在圖表上。這是可能的,如果是的話,我的方法是什麼部分是不正確的?

基於進一步的檢查,我認爲當ItemA和ValueB選擇ValueA時出現錯誤的原因以及只返回最後一個選定項的結果的原因是sqlDataSource.SelectCommand有最後一個在foreach循環中設置的值將用於最後選擇的項目。

有沒有一種方法,以配合一個SqlDataSource到一系列特定左右提供各系列到一個單獨的查詢時,數據綁定到每個系列看到正確的查詢圖表?

回答

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(); 

使用這種方法,你可以選擇值a和B值的項目1和項目2的任意組合,並正確地得到圖表上的數據。

相關問題