ASP.NET Chart управляет привязкой данных нескольких серий - PullRequest
4 голосов
/ 10 июня 2011

Используя следующую таблицу в качестве примера:

   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, его следует добавить как серию и отобразить на графике.

Данные отображаются правильно, но только для последнего проверенного элемента X.Если вы отметите Item1-> ValueA, а затем Item2-> ValueA в древовидном представлении, то при обновлении диаграммы с помощью кода ниже серии будет отображаться только ValueA для Item2

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 обрабатывается, давая список рядов, которые затем добавляются в диаграмму в привязке данных.

ЧтоПохоже, что происходит из-за того, что все серии основаны на легенде, и на диаграмме видны только данные для последнего выбранного элемента в виде дерева.

В конце концов я хочу, чтобыПользователь может выбрать любую комбинацию ValueA и ValueB для Item1 или Item2 и отобразить соответствующее число серий на диаграмме.Возможно ли это, и если да, то какая часть моего подхода неверна?

Основываясь на дальнейшем рассмотрении, я думаю, что причина, по которой я получаю ошибки, когда ValueA выбран для Item1 и ValueB для Item2, и причина, по которой результатытолько для последнего выбранного элемента возвращается то, что sqlDataSource.SelectCommand имеет последнее значение, которое было установлено в цикле foreach, которое будет для последнего выбранного элемента.

Есть ли способ связать sqlDataSource с конкретнымили около того серии предоставляют отдельный запрос для каждой серии, чтобы при привязке данных к диаграмме каждая серия видела правильный запрос?

1 Ответ

3 голосов
/ 10 июня 2011

Разобрался.

Я не использовал правильный метод привязки данных для достижения результатов, которые искал.

Чтобы заполнить данные в каждой серии так, как я хотел, необходимо использовать метод 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();

Используя этот метод, вы можете выбрать любую комбинацию ValueA и Value B для Item1 и Item2 и правильно получить данные на графике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...