Я хотел добавить на веб-страницу динамические диаграммы. Это так ...
Я получаю от пользователя дату начала и окончания и рисую отдельные диаграммы для каждой даты между датой начала и окончания.
Я получаю данные из базы данных sql и привязываю их к диаграмме следующим образом:
SqlConnection UsageLogConn = new
SqlConnection(ConfigurationManager.ConnectionStrings["UsageConn"].ConnectionString);
UsageLogConn.Open();//open connection
string sql = "SELECT v.interval,dateadd(mi,(v.interval-1)*2,'" + startdate + " 00:00:00') as 'intervaltime',COUNT(Datediff(minute,'" + startdate + " 00:00:00',d.DateTime)/2) AS Total FROM usage_internet_intervals v left outer join (select * from Usage_Internet where " + name + " LIKE ('%" + value + "%') and DateTime BETWEEN '" + startdate + " 00:00:00' AND '" + enddate + " 23:59:59') d on v.interval = Datediff(minute,'" + startdate + " 00:00:00',d.DateTime)/2 GROUP BY v.interval,Datediff(minute,'" + startdate + " 00:00:00',d.DateTime)/2 ORDER BY Interval";
SqlCommand cmd = new SqlCommand(sql, UsageLogConn);
SqlDataAdapter mySQLadapter = new SqlDataAdapter(cmd);
Chart1.DataSource = cmd;
// set series members names for the X and Y values
Chart1.Series["Series 1"].XValueMember = "intervaltime";
Chart1.Series["Series 1"].YValueMembers = "Total";
UsageLogConn.Close();
// data bind to the selected data source
Chart1.DataBind();
cmd.Dispose();
Приведенный выше код добавляет только одну диаграмму для одной даты, и я добавил диаграмму 1 в представление дизайна, а не созданную динамическую. Но я хотел добавить на веб-страницу больше динамических диаграмм во время выполнения.
Кто-нибудь может мне с этим помочь?
Я использую VS 2008, ASP.NET 3.5 а библиотека для построения графиков: using System.Web.UI.DataVisualization.Charting;





Хорошо, возможно, я переборщил, но я попытался сделать это довольно динамичным. Да, названия списков немного странные, но я использовал другой свой пример, чтобы построить это.
protected void Page_Load(object sender, EventArgs e)
{
Bench[] benchList;
FoodIntake[] foodIntakeList;
Panel panelChartHolder;
panelChartHolder = new Panel();
Controls.Add(panelChartHolder);
benchList = Bench.GetAll();
AddNewCharts(benchList, panelChartHolder,
GetBenchXValue, GetBenchYValue);
foodIntakeList = FoodIntake.GetAll();
AddNewCharts(foodIntakeList, panelChartHolder,
GetFoodIntakeXValue, GetFoodIntakeYValue);
}
Итак, первая часть проста. Создайте панель для хранения диаграмм, которые вы добавляете, получите списки, которые вы хотите представить в виде диаграмм (в этом примере они работают с Linq to Sql) и вызовите метод для создания диаграмм.
private void AddNewCharts<T>(T[] listToAdd, Panel panelToAddTo,
Func<T, DateTime> xMethod, Func<T, Int32> yMethod)
{
ChartArea mainArea;
Chart mainChart;
Series mainSeries;
mainChart = new Chart();
mainSeries = new Series("MainSeries");
for (Int32 loopCounter = 0; loopCounter < listToAdd.Length; loopCounter++)
{
mainSeries.Points.AddXY(xMethod(listToAdd[loopCounter]),
yMethod(listToAdd[loopCounter]));
}
mainChart.Series.Add(mainSeries);
mainArea = new ChartArea("MainArea");
mainChart.ChartAreas.Add(mainArea);
panelToAddTo.Controls.Add(mainChart);
}
Как видите, я просто создал новую диаграмму, добавил к ней серию и добавил к ней ChartArea. Следующая часть - это просто цикл по коллекции и добавление каждого элемента в сам список. Он использует переданные методы делегата (Func) для получения значений X и Y.
Последняя часть содержит четыре метода, отвечающих за получение значений X и Y из двух списков. В основном я делал это для того, чтобы метод создания диаграммы был максимально универсальным. Может быть, перебор.
private DateTime GetBenchXValue(Bench currentBench)
{
return currentBench.DateLifted;
}
private Int32 GetBenchYValue(Bench currentBench)
{
return currentBench.BenchAmount;
}
private DateTime GetFoodIntakeXValue(FoodIntake currentIntake)
{
return currentIntake.DateEaten;
}
private Int32 GetFoodIntakeYValue(FoodIntake currentIntake)
{
return currentIntake.Calories;
}
И поэтому, когда вы запустите это, вы получите два графика рядом. Имейте в виду, они будут очень простыми, так как есть миллион различных свойств, которые можно настроить для улучшения внешнего вида. Надеюсь, это то, о чем вы просили.
using System;
using System.Web.UI.DataVisualization.Charting;
using System.Web.UI.WebControls;
Честно говоря, похоже, что у вас уже есть другой код, который вам нужен, с тем, что вы написали выше. Я бы просто отправил команду в метод вместо того, что я сделал, привязку данных, а затем установил бы .XValueMember / .YValueMember. У вас есть большая часть того, что вам нужно, в вашем собственном коде.
Главное, что нужно сделать из моего поста, - это как динамически добавлять диаграммы. Вы уже выяснили привязку данных.
Я обновил образцы диаграмм MS для .NET 4.0 и добавил два дополнительных проекта - ChartsWithMVC и ChartsWithoutWebForms. Вы можете найти мой пример кода полезным, так как у меня очень простая реализация системы динамических диаграмм с использованием элемента управления диаграммой asp.net:
http://develocity.blogspot.com/2010/04/aspnet-chart-controls-without-web-forms.html
Надеюсь, это поможет.
protected void Page_Load(object sender, EventArgs e)
{
MySqlConnection UsageLogConn = new MySqlConnection("Server=localhost;UID=root;Password=;database=productactivation");
UsageLogConn.Open();//open connection
string sql = "select * from sales";
DataSet ds = new DataSet();
MySqlCommand cmd = new MySqlCommand(sql, UsageLogConn);
MySqlDataAdapter mySQLadapter = new MySqlDataAdapter(cmd);
mySQLadapter.Fill(ds);
Chart1.DataSource = ds;
// set series members names for the X and Y values
Chart1.Series["Series1"].XValueMember = "title_id";
Chart1.Series["Series1"].YValueMembers = "qty";
Chart1.Series["Series2"].XValueMember = "title_id";
Chart1.Series["Series2"].YValueMembers = "qty";
UsageLogConn.Close();
// data bind to the selected data source
Chart1.DataBind();
cmd.Dispose();
}
И DataSource, и DataSourceID определены в <control>, эта ссылка помогла мне: jibrankhan.wordpress.com/2008/06/18/…
Я использую sql, и у меня проблема с этой строкой mainSeries.Points.AddXY ("intervaltime", "Total"); где intervaltime, Total берется из запроса sql select.