最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下。

DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图、饼状图、柱状图等图表。

1.绘制图表基本步骤

  1.   准备数据并绑定

      这里从数据库中取得数据,可以根据自己的需要修改。

     1 DataTable dtData = BF<bll_ep_collection_data>.Instance.GetDataTable(sqlwhere, "data_time", parameters);2 //建立新的datatable,用来存储XY坐标3 DataTable dtXY = new DataTable();4 //横坐标的值5 dtXY.Columns.Add(new DataColumn("类型"));6 var list = new List<object>();7 //纵坐标的值8 list.Add("数值");9 //这里是控制x轴显示数据的数量,ArgumentScaleType类型设置为ScaleType.Qualitative时他不会自动控制x轴的数量
    10 //如果得到数据小于X_COUNT,则x轴显示全部得到的数据
    11 if (X_COUNT < dtData.Rows.Count)
    12 {
    13     for (int i = 0; i < X_COUNT; i++)
    14     {
    15         int index = (dtData.Rows.Count / X_COUNT) * i;
    16         DataRow item = dtData.Rows[index];
    17         dtXY.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
    18         list.Add(item["value"]);
    19     }
    20 }
    21 //如果得到数据大于X_COUNT,则x轴X_COUNT条数据
    22 else
    23 {
    24     for (int i = 0; i < dtData.Rows.Count; i++)
    25     {
    26         DataRow item = dtData.Rows[i];
    27         dtXY.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
    28         list.Add(item["value"]);
    29     }
    30 }
    31 var array = list.ToArray();
    32 dtXY.Rows.Add(array);
    33 this.chartControl1.DataSource = dtXY;                

      一个更直白的例子:

     1 DataTable dt = new DataTable();2 dt.Columns.Add(new DataColumn("类型"));3 dt.Columns.Add(new DataColumn("2005-1月", typeof(decimal)));4 dt.Columns.Add(new DataColumn("2005-2月", typeof(decimal)));5 dt.Columns.Add(new DataColumn("2005-3月", typeof(decimal)));6 dt.Columns.Add(new DataColumn("2005-4月", typeof(decimal)));7 dt.Columns.Add(new DataColumn("2005-5月", typeof(decimal)));8 dt.Columns.Add(new DataColumn("2005-6月", typeof(decimal)));9
    10 dt.Rows.Add(new object[] { "员工人数", 437, 437, 414, 397, 387, 378 });
    11 dt.Rows.Add(new object[] { "人均月薪", 3964, 3961, 3979, 3974, 3967, 3972 });
    12 dt.Rows.Add(new object[] { "成本TEU", 3104, 1339, 3595.8, 3154.5, 2499.8, 3026 });
    13 dt.Rows.Add(new object[] { "人均生产率", 7.1, 3.06, 8.69, 7.95, 6.46, 8.01 });
    14 dt.Rows.Add(new object[] { "占2005年3月人数比例", 1.06, 1.06, 1, 0.96, 0.93, 0.91 });

  2.   根据数据创建图形展现

       CreateSeries用于创建一个典型的图形,这里展示创建一条曲线。

     1 /// <summary>
     2 /// 根据数据创建一个图形展现
     3 /// </summary>
     4 /// <param name="caption">图形标题</param>
     5 /// <param name="viewType">图形类型</param>
     6 /// <param name="dt">数据DataTable</param>
     7 /// <param name="rowIndex">图形数据的行序号</param>
     8 /// <returns></returns>
     9 private Series CreateSeries(string caption, ViewType viewType, DataTable dt, int rowIndex)
    10 {
    11     Series series = new Series(caption, viewType);
    12     for (int i = 1; i < dt.Columns.Count; i++)
    13     {
    14         string argument = dt.Columns[i].ColumnName;//参数名称
    15         decimal value = (decimal)dt.Rows[rowIndex][i];//参数值
    16         series.Points.Add(new SeriesPoint(argument, value));
    17     }
    18     //必须设置ArgumentScaleType的类型,否则显示会转换为日期格式,导致不是希望的格式显示
    19     //也就是说,显示字符串的参数,必须设置类型为ScaleType.Qualitative
    20     series.ArgumentScaleType = ScaleType.Qualitative;
    21     //series.ArgumentScaleType = ScaleType.DateTime;
    22     series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.False;//显示标注标签
    23     return series;
    24 }

  3.   根据图形对象创建一个图表并绑定到CharControl中

     1 /// <summary>
     2 /// 根据图形对象创建一个图表
     3 /// </summary>
     4 /// <param name="chartControl">图表绑定控件</param>
     5 /// <param name="list">图表中的图形展现</param>
     6 /// <returns></returns>
     7 private void CreateChart(ChartControl chartControl, List<Series> list)
     8 {
     9     chartControl.Series.AddRange(list.ToArray());
    10     chartControl.Legend.Visible = false;
    11     chartControl.SeriesTemplate.LabelsVisibility = DefaultBoolean.False;
    12     //XYDiagram diagram = (XYDiagram)chartControl1.Diagram;
    13     //diagram.AxisX.DateTimeMeasureUnit = DateTimeMeasurementUnit.Second;
    14     //diagram.AxisX.DateTimeOptions.Format = DateTimeFormat.Custom;
    15     //diagram.AxisX.DateTimeOptions.FormatString = "yyyy-MM-dd HH:mm:ss";
    16 }

  4.   调用函数绘制图表

     1 //清空ChartControl控件
     2 chartControl1.Series.Clear();
     3 //创建图形对象的列表
     4 List<Series> list = new List<Series>();
     5 foreach (DataRowView item in listBox.Items)
     6 {
     7     string str = item["key"].ToString();
     8     //通过LoadData返回一个DataTable
     9     DataTable dtXY = LoadData(str);
    10     //创建一个图形对象
    11     Series series = CreateSeries(caption, type, dtXY, 0);;
    12     list.Add(series);
    13 }
    14 //根据图形对象列表创建一个图表
    15 CreateChart(chartControl1, list);

  小结:在绘制折线图的时候我遇到的一个很大的问题就是没办法控制数据的显示数量,因为数据库中存储的数据量过大,在一定时间段内的数据都能达到上千条,所以不可能一次性全部显示。我想到的解决办法是固定显示多少条数据,比如说20条,然后根据数据量每隔一段距离取一条数据显示。  

2.柱状图

绘制柱状图其实和绘制折线图没有什么区别,就是将new Series时的图形类型改为ViewType.Bar即可,这里我想总结一下一个困扰我很久的问题,如何绘制上图所示的一个横坐标对应两个或者多个柱子。

  1.   准备数据

     1 DataTable dtData = SqlHelper.GetDataSet(sql, parameters).Tables[0];
     2 //建立新的datatable,用来存储XY坐标
     3 DataTable dtXY_max = new DataTable();
     4 DataTable dtXY_min = new DataTable();
     5 dtXY_max.Columns.Add(new DataColumn("类型"));
     6 dtXY_min.Columns.Add(new DataColumn("类型"));
     7 var list_max = new List<object>();
     8 list_max.Add("数值");
     9 var list_min = new List<object>();
    10 list_min.Add("数值");
    11 for (int i = 0; i < dtData.Rows.Count; i++)
    12 {
    13     DataRow item = dtData.Rows[i];
    14     string value = item["max"].ToString() + "|" + item["min"].ToString();
    15     //dtXY.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(string)));
    16     //list.Add(value);
    17     dtXY_max.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
    18     list_max.Add(item["max"]);
    19     dtXY_min.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
    20     list_min.Add(item["min"]);
    21 }
    22 var array_max = list_max.ToArray();
    23 dtXY_max.Rows.Add(array_max);
    24 var array_min = list_min.ToArray();
    25 dtXY_min.Rows.Add(array_min);

  2.   创建图形展现对象方法

     1 /// <summary>
     2 /// 根据数据创建一个图形展现
     3 /// </summary>
     4 /// <param name="caption">图形标题</param>
     5 /// <param name="viewType">图形类型</param>
     6 /// <param name="dt">数据DataTable</param>
     7 /// <param name="rowIndex">图形数据的行序号</param>
     8 /// <returns></returns>
     9 private Series CreateSeries(string caption, ViewType viewType, DataTable dt, int rowIndex)
    10 {
    11     Series series = new Series(caption, viewType);
    12     for (int i = 1; i < dt.Columns.Count; i++)
    13     {
    14         string argument = dt.Columns[i].ColumnName;//参数名称
    15         decimal value = (decimal) dt.Rows[rowIndex][i];
    16         series.Points.Add(new SeriesPoint(argument, value));
    17     }
    18     //柱状图柱子的宽度设置
    19     //BarSeriesView bsv = (BarSeriesView)series.View;
    20     //bsv.BarWidth = 0.1;
    21     //必须设置ArgumentScaleType的类型,否则显示会转换为日期格式,导致不是希望的格式显示
    22     //也就是说,显示字符串的参数,必须设置类型为ScaleType.Qualitative
    23     series.ArgumentScaleType = ScaleType.Qualitative;
    24     //series.ArgumentScaleType = ScaleType.DateTime;
    25     series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;//显示标注标签
    26     return series;
    27 }

  3.   根据图形对象创建图表

     1 /// <summary>
     2 /// 根据图形对象创建一个图表
     3 /// </summary>
     4 /// <param name="chartControl">图标绑定控件</param>
     5 /// <param name="list">图表中的图形展现</param>
     6 /// <returns></returns>
     7 private void CreateChart(ChartControl chartControl, List<Series> series)
     8 {
     9     chartControl.Series.AddRange(series.ToArray());
    10     //chartControl.Series.Add(series);
    11     chartControl.Legend.Visible = true;
    12     chartControl.SeriesTemplate.LabelsVisibility = DefaultBoolean.True;
    13     XYDiagram xydiagram = (XYDiagram)chartControl.Diagram;
    14     xydiagram.AxisX.MinorCount = 10;
    15 }

3.饼状图

  1.   准备数据

     1 private DataTable CreateChartData()
     2 {
     3     DataTable dtData = SqlHelper.GetDataSet(sql, parameters).Tables[0];
     4     DataTable table = new DataTable("Table1");
     5     table.Columns.Add("Name", typeof(String));
     6     table.Columns.Add("Value", typeof(Double));
     7     foreach (DataRow item in dtData.Rows)
     8     {
     9         var array = new object[] { item["value_num"], item["count"] };
    10         table.Rows.Add(array);
    11     }
    12     return table;
    13 }

  2.   创建一个饼状图

     1 /// <summary>
     2 /// 根据数据创建一个饼状图
     3 /// </summary>
     4 /// <returns></returns>
     5 private void BuilderDevChart()
     6 {
     7     Series _pieSeries = new Series("测试", ViewType.Pie);
     8     _pieSeries.ValueDataMembers[0] = "Value";
     9     _pieSeries.ArgumentDataMember = "Name";
    10     _pieSeries.DataSource = CreateChartData();
    11     chartControl1.Series.Add(_pieSeries);
    12     _pieSeries.SetPiePercentage();
    13     _pieSeries.LegendPointOptions.PointView = PointView.ArgumentAndValues;
    14 }

  3.   设置饼状图显示方式(数值/百分比)

     1 public static class ExtensionClass
     2 {
     3     /// <summary>
     4     /// 设置饼状Series显示方式(值/百分比)
     5     /// </summary>
     6     /// <param name="series">Series</param>
     7     public static void SetPiePercentage(this Series series)
     8     {
     9         if (series.View is PieSeriesView)
    10         {
    11             //设置为值
    12             //((PiePointOptions)series.PointOptions).PercentOptions.ValueAsPercent = false;
    13             //((PiePointOptions)series.PointOptions).ValueNumericOptions.Format = NumericFormat.Number;
    14             //((PiePointOptions)series.PointOptions).ValueNumericOptions.Precision = 0;
    15             //设置为百分比
    16             ((PiePointOptions)series.PointOptions).PercentOptions.ValueAsPercent = true;
    17             ((PiePointOptions)series.PointOptions).ValueNumericOptions.Format = NumericFormat.Percent;
    18             ((PiePointOptions)series.PointOptions).ValueNumericOptions.Precision = 0;
    19         }
    20     }
    21 } 

原文: https://mrlrf.github.io/2016/12/07/DevExpress-ChartControl/

转载于:https://www.cnblogs.com/Mr-Li-2016/p/6115089.html

WinForm DevExpress使用之ChartControl控件绘制图表一——基础相关推荐

  1. WinForm DevExpress使用-(ChartControl控件绘制图表)

    最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱 ...

  2. 使用DevExpress的WebChartControl控件绘制图表(柱状图、折线图、饼图)

    WebChartControl是DevExpress控件群下的一个Web图表控件,它使用非常的方便,生成的图表也相当的漂亮. 先贴出几张WebChartControl生成的图表: Web页面代码Web ...

  3. 【转】使用DevExpress的WebChartControl控件绘制图表(柱状图、折线图、饼图)

    第一次写博,没什么经验,主要是把最近自己对Dev的一些研究贴出来大家共同探讨,有不足之处望大家帮忙斧正. WebChartControl是DevExpress控件群下的一个Web图表控件,它使用非常的 ...

  4. c# 使用dotnetbar 控件绘制曲线图形

    废话不说,直接上过程 加载dotnetbar库后,将chartcontrol控件拖动到界面上,选择line polt 增加一个按钮,绘制曲线功能 private void buttonX26_Clic ...

  5. Winform下的地图开发控件(GMap.NET)使用心得之二

    在上篇<Winform下的地图开发控件(GMap.NET)使用心得>中简单介绍了GMap.NET的控件基本情况,本篇开始介绍一下相关的代码操作. 其实目前GMap.NET提供的功能还不是很 ...

  6. 在DevExpress中使用CameraControl控件进行摄像头图像采集

    在我们以前的项目了,做摄像头的图片采集,我们一般还是需要做一个封装处理的,在较新版本的DevExpress控件里面,增加了一个CameraControl控件,可以直接调用摄像头显示的,因此也可以做头像 ...

  7. DevExpress的分隔条控件SplitterControl的使用

    场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...

  8. Winform下的地图开发控件(GMap.NET)使用心得

    原文地址为: Winform下的地图开发控件(GMap.NET)使用心得 我们先看看GMap.NET的定义: GMap.NET是一个强大.免费.跨平台.开源的.NET控件,它在Windows Form ...

  9. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色  在B/S开发中,对TreeView控件要改变当前选中节点的颜色比较方便,其有相应的SelectedNodeChanged事件 ...

  10. C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib,该怎么解决...

    C# WinForm 添加Windows Media Player 控件调试出现未能加载文件或程序集Interop.WMPLib 如标题,在窗体中添加Windows Media Player 控件,当 ...

最新文章

  1. 企业级 SpringBoot 教程 (二十三)异步方法
  2. DMG MORI AKTIENGESELLSCHAFT
  3. 光磁记录实现数据冷存储
  4. 前端学习(1988)vue之电商管理系统电商系统之获取商品列表
  5. HashMap与ConcurrentHashMap的区别
  6. python编程入门与案例详解-自学Python 编程基础、科学计算及数据分析
  7. Linux负载均衡--LVS
  8. Redis 安装教程
  9. CASS11.0.0.6安装以及教程
  10. nginx配置-优化静态资源
  11. 【C语言】蓝桥杯/ACM竞赛入门 A+B for Input-Output Practice
  12. Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别
  13. IMX6 VPU解码流程
  14. Vue动态设置路由title
  15. UI自动化测试(Selenium,Unittest,DDT)
  16. 【Linux】IFS是个什么鬼
  17. LeetCode——1104. 二叉树寻路(Path In Zigzag Labelled Binary Tree)[中等]——分析及代码(Java)
  18. 利用Python探测附近WIFI密码的详细代码
  19. Linux:驱动之自动创建字符设备的设备文件(未完)
  20. 最适合初学者的21个机器学习项目,附实战代码+数据集

热门文章

  1. 【算法】二叉树遍历算法总结:前序中序后序遍历
  2. 案例应用|如何借助SPC软件实现汽车零配件品质管理
  3. python 3d游戏 源码_毕设3D游戏《天鹰教》源码
  4. sql server2008密钥,sql server 2008 r2 序列号密钥
  5. 友勤2017年1月份Oracle P6软件培训班圆满结束
  6. 最全行车记录仪主控芯片及方案排名TOP15、行车记录仪终端品牌厂商代表产品和方案排名TOP50
  7. 北京1954坐标转为经纬度坐标
  8. clover使用教程
  9. 重磅开源!一款引入实时语音与声纹识别的网络辩论系统!
  10. 倍福plc的型号_常用PLC型号大全及简介,选型必备技能!