WinFormDevExpress使⽤之ChartControl控件绘制图表⼀——
基础
最近因为公司项⽬需要⽤到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>
9private Series CreateSeries(string caption, ViewType viewType, DataTable dt, int rowIndex)
10 {
11    Series series = new Series(caption, viewType);
12for (int i = 1; i < dt.Columns.Count; i++)
13    {
14string argument = dt.Columns[i].ColumnName;//参数名称
15decimal 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;//显⽰标注标签
23return series;
24 }
3.   根据图形对象创建⼀个图表并绑定到CharControl中
1///<summary>
2///根据图形对象创建⼀个图表
typeof array
3///</summary>
4///<param name="chartControl">图表绑定控件</param>
5///<param name="list">图表中的图形展现</param>
6///<returns></returns>
7private 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>();
5foreach (DataRowView item in listBox.Items)
6 {
7string 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("类型"));
7var list_max = new List<object>();
8 list_max.Add("数值");
9var list_min = new List<object>();
10 list_min.Add("数值");
11for (int i = 0; i < dtData.Rows.Count; i++)
12 {
13    DataRow item = dtData.Rows[i];
14string 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 }
22var array_max = list_max.ToArray();
23 dtXY_max.Rows.Add(array_max);
24var 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>
9private Series CreateSeries(string caption, ViewType viewType, DataTable dt, int rowIndex)
10 {
11    Series series = new Series(caption, viewType);
12for (int i = 1; i < dt.Columns.Count; i++)
13    {
14string argument = dt.Columns[i].ColumnName;//参数名称
15decimal 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;//显⽰标注标签
26return series;
27 }
3.   根据图形对象创建图表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。