Есть еще один способ для построения графика. Создаем объектную модель для элементов будущего графика:
| Код | namespace MSChart.Utility { public class Graph { public IList<Category> categories = new List<Category>(); public IList<DataSet> dataSets = new List<DataSet>();
public String Name { get; set; } public IList<Category> Categories { get { return categories; } protected set { categories = value; } } public IList<DataSet> DataSets { get { return dataSets; } protected set { dataSets = value; } } public Graph() { // // TODO: Add constructor logic here // } }
public class Category { public String Name { get; set; } public Category() { // // TODO: Add constructor logic here // } }
public class DataSet { private IList<String> values = new List<String>(); public DataSet(String name, String color) { Name = name; Color = color; } public DataSet() { } public String Name { get; set; } public String Color { get; set; } public IList<String> Values { get { return values; } protected set { values = value; } } }
|
Graph – представляет собой диаграмму в объектной модели; Category – представляет собой категорию в объектной модели; DataSet – представляет собой коллекцию данных для конкретной серии. Далее прописываем метод для построения файла в Xml-формате:
| Код | public class MSChart { private Graph _graph; private string doc1; public MSChart(Graph graph) { _graph = graph; } public string BuildDataSource() { XDocument doc = new XDocument( new XElement("graph", new XAttribute("caption", _graph.Name), new XAttribute("fromnum", "0"), new XAttribute("decimalPrecision", "0"), new XElement("categories", from x in _graph.categories select new XElement("category", new XAttribute("name", x.Name))), from x in _graph.dataSets select new XElement("dataSet", new XAttribute("seriesName", x.Name), new XAttribute("color", x.Color), from y in x.Values select new XElement("set", new XAttribute("value", y))) ) ); return doc.ToString().Replace("\"", "'"); }
|
В основном тексте программы прописываем код для заполнения xml-источника:
| Код | List<String> values = new List<String>(); List<String> legend = new List<String>(); Graph graph = new Graph(); graph.Name = "Зависимость глубины проплавления от силы тока"; Int32 startValue = 1;
MSChart.Utility.DataSet dataSet1 = new MSChart.Utility.DataSet("h1", "10a625"); graph.DataSets.Add(dataSet1);
MSChart.Utility.DataSet dataSet2 = new MSChart.Utility.DataSet("h2", "fea203"); graph.DataSets.Add(dataSet2);
MSChart.Utility.DataSet dataSet3 = new MSChart.Utility.DataSet("h3", "fbfe03"); graph.DataSets.Add(dataSet3);
foreach (DataRow row in table.Rows) { values.Add(startValue.ToString()); Category category = new Category(); category.Name = row[0].ToString(); graph.Categories.Add(category);
legend.Add(String.Format(" <b>{0}</b> - {1}", startValue, row[0]));
dataSet1.Values.Add(DataRowExtensions.Field<Int32>(row, "h1").ToString()); dataSet2.Values.Add(DataRowExtensions.Field<Int32>(row, "h2").ToString()); dataSet3.Values.Add(DataRowExtensions.Field<Int32>(row, "h3").ToString()); }
rptLegend.DataSource = legend; rptLegend.DataBind();
MSChart.Utility.MSChart chart = new MSChart.Utility.MSChart(graph);
divLineChart.InnerHtml = FusionCharts.RenderChartHTML(ResolveClientUrl("~/FusionCharts/FCF_MSLine.swf"), "", chart.BuildDataSource(), "id", "600", "300", false);
|
Данный источник берет данные из таблиц БД, созданной на сервере. Правда в данном коде есть недочеты, которые я пока не исправила: 1. xml-источник не сохраняется (т.е. метод CreateChart не видит его, а значит не видит данных для построения графика) 2. http://forum.vingrad.ru/forum/topic-261560/anchor-entry1884048/0.html 3. График выбирает строки из таблицы, если данные прописаны в столбцах, код работает неверно (график будет строиться не по тем данным) Если кто-то будет разбираться и найдет, как исправить эти ошибки - буду рада ответам Так же http://www.maani.us/xml_charts/index.php можно посмотреть коллекцию готовых xml-источников для построения chart-объектов различного типа и сложности. |