Telerik入门之Bar-多维数据绘制


前言

之前我们探究过Telerik入门—简单柱状图绘制,接下来我们来绘制多维(多系列)的数据。


一、对List进行扩展

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BNTU.Extensions
{
    static class ListExtensions
    {
        /// <summary>
        /// @描述:如果希望以differBy字段为聚合依据,获取该字段的取值集合
        /// </summary>
        /// <typeparam name="Table">哪一张表(实体对象模型)</typeparam>
        /// <param name="data_List">那个数据集</param>
        /// <param name="differBy">以该字段为聚合依据</param>
        /// <returns>取值集合</returns>
        public static List<string> GetDifferents<Table>(this List<Table> data_List, string differBy)
        {
            // 存储不同的系列依据
            List<string> differ_List = new List<string>();

            // 创建GroupBy字句的委托函数
            Func<Table, string> groupByFunc =
                delegate(Table table)
                {
                    var value = typeof(Table).GetProperty(differBy).GetValue(table, null);
                    return value == null ? "NULL" : value.ToString();
                };

            // 开始聚合
            List<IGrouping<string, Table>> table_Grouping_List = data_List.GroupBy(groupByFunc).ToList();

            // 取出聚合之后的differBy(Key)的集合
            foreach (IGrouping<string, Table> table_Grouping_Item in table_Grouping_List)
            {
                differ_List.Add(table_Grouping_Item.Key);
            }

            return differ_List;
        }

        /// <summary>
        /// @描述:按照differBy进行划分,将原数据集按照DifferBy字段聚合之后的多组数据集
        /// </summary>
        /// <typeparam name="Table">哪一张表(实体对象模型)</typeparam>
        /// <param name="data_List">那个数据集</param>
        /// <param name="differBy">以该字段为聚合依据</param>
        /// <returns>将原数据集按照DifferBy字段聚合之后的多组数据集</returns>
        public static List<List<Table>> DifferBy<Table>(this List<Table> data_List, string differBy)
        {
            // 获取聚合依据的取值集合
            List<string> differ_List = data_List.GetDifferents(differBy);

            // 声明将原数据集按照DifferBy字段聚合之后的多组数据集
            List<List<Table>> data_List_WithGroups = new List<List<Table>>();

            // 进行分组
            foreach (var fieldValue in differ_List)
            {
                // 分组依据(委托函数)
                Func<Table, bool> whereFunc =
                    delegate(Table table)
                    {
                        var value = typeof(Table).GetProperty(differBy).GetValue(table, null);
                        return value.ToString().Equals(fieldValue);
                    };

                List<Table> sameFieldValue_List = data_List.Where(whereFunc).ToList();
                data_List_WithGroups.Add(sameFieldValue_List);
            }

            return data_List_WithGroups;
        }
    }
}


二、对RadChartView扩展

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Telerik.WinControls.UI;
using System.Reflection;
using Telerik.Charting;
using BNTU.Extensions;
using System.Drawing;

namespace BNTU.Extensions.Telerik
{
    public static class RadChartViewExtensions
    {
        public static void LoadBarChart<Table>(this RadChartView radChartView, List<Table> data_List, string xAxisName, string yAxisName, string differBy, CategoricalAxis horizontalAxis = null, LinearAxis verticalAxis = null)
        {
            List<List<Table>> data_List_WithGroups = data_List.DifferBy(differBy);

            foreach (var data_List_Group in data_List_WithGroups)
            {
                radChartView.LoadBarChart(data_List_Group, xAxisName, yAxisName);
            }

            radChartView.SetAxis();
        }

        public static void LoadBarChart<Table>(this RadChartView radChartView, List<Table> data_List, string xAxisName, string yAxisName)
        {
            BarSeries barSeries = new BarSeries();//定义一个柱状图集合
            barSeries.ShowLabels = true;//显示值数据
            foreach (var data in data_List)
            {
                var category = typeof(Table).GetProperty(xAxisName).GetValue(data, null);
                double value = double.Parse(typeof(Table).GetProperty(yAxisName).GetValue(data, null).ToString());
                barSeries.DataPoints.Add(new CategoricalDataPoint(value, category));
            }
            radChartView.Series.Add(barSeries);//添加柱状图集合
        }

        public static void SetAxis(this RadChartView radChartView, CategoricalAxis horizontalAxis = null, LinearAxis verticalAxis = null)
        {
            BarSeries barSeries = radChartView.Series.FirstOrDefault() as BarSeries;

            #region 添加垂直Y轴信息
            LinearAxis linearAxis = barSeries.VerticalAxis as LinearAxis;
            if (verticalAxis == null)
            {
                linearAxis.CustomFont = "Times New Roman";
                linearAxis.CustomFontSize = 10f;
                linearAxis.MajorStep = 20f;
            }
            else
            {
                linearAxis.CustomFont = verticalAxis.CustomFont;
                linearAxis.CustomFontSize = verticalAxis.CustomFontSize;
                linearAxis.MajorStep = verticalAxis.MajorStep;
            }
            #endregion

            #region 添加水平X轴信息
            CategoricalAxis categoricalAxis = barSeries.HorizontalAxis as CategoricalAxis;
            if (horizontalAxis == null)
            {
                categoricalAxis.LabelFitMode = AxisLabelFitMode.Rotate;
                categoricalAxis.GapLength = 1.0 / radChartView.Series.Count;
                categoricalAxis.CustomFont = "Times New Roman";
                categoricalAxis.CustomFontSize = 10f;
                categoricalAxis.BorderColor = Color.FromArgb(209, 209, 209);
            }
            else
            {
                categoricalAxis.LabelFitMode = horizontalAxis.LabelFitMode;
                categoricalAxis.GapLength = horizontalAxis.GapLength;
                categoricalAxis.CustomFont = horizontalAxis.CustomFont;
                categoricalAxis.CustomFontSize = horizontalAxis.CustomFontSize;
                categoricalAxis.BorderColor = horizontalAxis.BorderColor;
            }
            #endregion
        }
    }
}



三、设置图表样式以及构造实体对象模型

这一部分与Telerik入门—简单柱状图绘制一致,不做改变。



四、使用LoadBarChart绘图

1. 加载数据

private List<Student> GetData()
{
    List<Student> student_List = new List<Student>();

    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 89, Time = "2018-1" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 65, Time = "2018-2" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 85, Time = "2018-3" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 93, Time = "2019-1" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 92, Time = "2019-2" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 75, Time = "2019-3" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 96, Time = "2020-1" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 78, Time = "2020-2" });
    student_List.Add(new Student { StudentID = "180502304", StudentName = "bntu", Score = 99, Time = "2020-3" });

    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 69, Time = "2018-1" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 79, Time = "2018-2" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 76, Time = "2018-3" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 95, Time = "2019-1" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 88, Time = "2019-2" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 89, Time = "2019-3" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 95, Time = "2020-1" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 93, Time = "2020-2" });
    student_List.Add(new Student { StudentID = "180502301", StudentName = "bntvva", Score = 82, Time = "2020-3" });

    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 56, Time = "2018-1" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 50, Time = "2018-2" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 50, Time = "2018-3" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 51, Time = "2019-1" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 52, Time = "2019-2" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 44, Time = "2019-3" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 47, Time = "2020-1" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 52, Time = "2020-2" });
    student_List.Add(new Student { StudentID = "180502302", StudentName = "bntcc", Score = 42, Time = "2020-3" });

    return student_List;
}

2. 在Form1的构造函数中调用

// 加载柱状图
this.radChartView1.LoadBarChart(GetData(), "Time", "Score", "StudentName");


五、项目代码

百度网盘地址;提取码:cvn4;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值