WinForm使用DecExpress控件中的ChartControl插件绘制图表

目录
  • 1.绘制图表基本步骤
    • 准备数据并绑定
    • 根据数据创建图形展现
    • 根据图形对象创建一个图表并绑定到CharControl中
    • 调用函数绘制图表
  • 2.柱状图
    • 准备数据
    • 创建图形展现对象方法
    • 根据图形对象创建图表
  • 3.饼状图
    • 准备数据
    • 创建一个饼状图
    • 设置饼状图显示方式(数值/百分比)

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

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

1.绘制图表基本步骤

准备数据并绑定

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

DataTable dtData = BF<bll_ep_collection_data>.Instance.GetDataTable(sqlwhere, "data_time", parameters);
//建立新的datatable,用来存储XY坐标
DataTable dtXY = new DataTable();
//横坐标的值
dtXY.Columns.Add(new DataColumn("类型"));
var list = new List<object>();
//纵坐标的值
list.Add("数值");
//这里是控制x轴显示数据的数量,ArgumentScaleType类型设置为ScaleType.Qualitative时他不会自动控制x轴的数量
//如果得到数据小于X_COUNT,则x轴显示全部得到的数据
if (X_COUNT < dtData.Rows.Count)
{
    for (int i = 0; i < X_COUNT; i++)
    {
        int index = (dtData.Rows.Count / X_COUNT) * i;
        DataRow item = dtData.Rows[index];
        dtXY.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
        list.Add(item["value"]);
    }
}
//如果得到数据大于X_COUNT,则x轴X_COUNT条数据
else
{
    for (int i = 0; i < dtData.Rows.Count; i++)
    {
        DataRow item = dtData.Rows[i];
        dtXY.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
        list.Add(item["value"]);
    }
}
var array = list.ToArray();
dtXY.Rows.Add(array);
this.chartControl1.DataSource = dtXY;

一个更直白的例子:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("类型"));
dt.Columns.Add(new DataColumn("2005-1月", typeof(decimal)));
dt.Columns.Add(new DataColumn("2005-2月", typeof(decimal)));
dt.Columns.Add(new DataColumn("2005-3月", typeof(decimal)));
dt.Columns.Add(new DataColumn("2005-4月", typeof(decimal)));
dt.Columns.Add(new DataColumn("2005-5月", typeof(decimal)));
dt.Columns.Add(new DataColumn("2005-6月", typeof(decimal)));

dt.Rows.Add(new object[] { "员工人数", 437, 437, 414, 397, 387, 378 });
dt.Rows.Add(new object[] { "人均月薪", 3964, 3961, 3979, 3974, 3967, 3972 });
dt.Rows.Add(new object[] { "成本TEU", 3104, 1339, 3595.8, 3154.5, 2499.8, 3026 });
dt.Rows.Add(new object[] { "人均生产率", 7.1, 3.06, 8.69, 7.95, 6.46, 8.01 });
dt.Rows.Add(new object[] { "占2005年3月人数比例", 1.06, 1.06, 1, 0.96, 0.93, 0.91 });

根据数据创建图形展现

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

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

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

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

调用函数绘制图表

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

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

2.柱状图

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

准备数据

DataTable dtData = SqlHelper.GetDataSet(sql, parameters).Tables[0];
//建立新的datatable,用来存储XY坐标
DataTable dtXY_max = new DataTable();
DataTable dtXY_min = new DataTable();
dtXY_max.Columns.Add(new DataColumn("类型"));
dtXY_min.Columns.Add(new DataColumn("类型"));
var list_max = new List<object>();
list_max.Add("数值");
var list_min = new List<object>();
list_min.Add("数值");
for (int i = 0; i < dtData.Rows.Count; i++)
{
    DataRow item = dtData.Rows[i];
    string value = item["max"].ToString() + "|" + item["min"].ToString();
    //dtXY.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(string)));
    //list.Add(value);
    dtXY_max.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
    list_max.Add(item["max"]);
    dtXY_min.Columns.Add(new DataColumn(item["data_time"].ToString(), typeof(decimal)));
    list_min.Add(item["min"]);
}
var array_max = list_max.ToArray();
dtXY_max.Rows.Add(array_max);
var array_min = list_min.ToArray();
dtXY_min.Rows.Add(array_min);

创建图形展现对象方法

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

根据图形对象创建图表

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

3.饼状图

准备数据

private DataTable CreateChartData()
{
    DataTable dtData = SqlHelper.GetDataSet(sql, parameters).Tables[0];
    DataTable table = new DataTable("Table1");
    table.Columns.Add("Name", typeof(String));
    table.Columns.Add("Value", typeof(Double));
    foreach (DataRow item in dtData.Rows)
    {
        var array = new object[] { item["value_num"], item["count"] };
        table.Rows.Add(array);
    }
    return table;
}

创建一个饼状图

/// <summary>
/// 根据数据创建一个饼状图
/// </summary>
/// <returns></returns>
private void BuilderDevChart()
{
    Series _pieSeries = new Series("测试", ViewType.Pie);
    _pieSeries.ValueDataMembers[0] = "Value";
    _pieSeries.ArgumentDataMember = "Name";
    _pieSeries.DataSource = CreateChartData();
    chartControl1.Series.Add(_pieSeries);
    _pieSeries.SetPiePercentage();
    _pieSeries.LegendPointOptions.PointView = PointView.ArgumentAndValues;
}

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

public static class ExtensionClass
{
    /// <summary>
    /// 设置饼状Series显示方式(值/百分比)
    /// </summary>
    /// <param name="series">Series</param>
    public static void SetPiePercentage(this Series series)
    {
        if (series.View is PieSeriesView)
        {
            //设置为值
            //((PiePointOptions)series.PointOptions).PercentOptions.ValueAsPercent = false;
            //((PiePointOptions)series.PointOptions).ValueNumericOptions.Format = NumericFormat.Number;
            //((PiePointOptions)series.PointOptions).ValueNumericOptions.Precision = 0;
            //设置为百分比
            ((PiePointOptions)series.PointOptions).PercentOptions.ValueAsPercent = true;
            ((PiePointOptions)series.PointOptions).ValueNumericOptions.Format = NumericFormat.Percent;
            ((PiePointOptions)series.PointOptions).ValueNumericOptions.Precision = 0;
        }
    }
}

到此这篇关于WinForm使用DecExpress控件中的ChartControl插件绘制图表的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#实现绘制面形图表的方法详解

    本例详细讲述了C#实现的面形图绘制例子,这是其中一个核心绘制文件的代码,代码中的里面的注释很多,也比较详细,相信对于初学者学习及理解C#图形绘制方面的技术要点.难点有所帮助. C#绘制面形图的主要功能代码如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using S

  • DevExpress之ChartControl实现饼状图百分比演示实例

    本文实例讲述了DevExpress中ChartControl实现饼状图百分比演示的方法.分享给大家供大家参考.具体实现方法如下: 关键代码如下: 复制代码 代码如下: using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; namespace DevExpressChart {     public partial class winPieSeriesView : Form

  • DevExpress之ChartControl的SeriesTemplate实例

    本文实例讲述了DevExpress之ChartControl的SeriesTemplate用法,分享给大家供大家参考.具体方法如下: 关键代码如下: 复制代码 代码如下: using System; using System.Data; using System.Windows.Forms; using CSharpUtilHelpV2; using DevExpress.XtraCharts; namespace DevExpressChart {     public partial cla

  • DevExpress之ChartControl用法实例总结

    DevExpress中的ChartControl顾名思义就是数据基于图表展示,其关键在于Series上的处理.本文实例展示了ChartControl的用法,具体内容如下: 主要功能代码部分如下: using System; using System.Drawing; using DevExpress.XtraCharts; namespace DevExpressUtilHelpV3 { public static class ChartToolV3 { /// <summary> /// 创

  • DevExpress之ChartControl创建Drill-Down样式的Title实例

    本文实例讲述了DevExpress中ChartControl创建Drill-Down样式的Title实现方法.分享给大家供大家参考.具体实现方法如下: 关键代码如下: 复制代码 代码如下: /// <summary> /// 创建Drill-Down样式的Title /// </summary> /// <param name="chart">ChartControl</param> /// <param name="ti

  • C#中使用DevExpress中的ChartControl实现极坐标图的案例详解

    目录 背景 实现思路 参考代码 背景 在工控软件的开发中很多业务场景就是使用图表控件展示设备和工艺参数.如下图案例: 实现思路 通常简单的做法是使用图表控件实现,常用的图表控件有开源的ZedGraph,还有付费的TeeChart和DevExpress.常规的曲线图.柱状图.饼图的实现,三个控件都可以很好的实现,建议使用开源的ZedGraph.但是在实现雷达图.极坐标图等特定图表时ZedGraph就不能支持,TeeChart用起来也不是那么完美,对比后发现DevExpress的ChartContr

  • DevExpress之ChartControl实现柱状图演示实例

    本文实例讲述了DevExpress中ChartControl实现柱状图演示的方法.分享给大家供大家参考.具体实现方法如下: 关键代码如下: 复制代码 代码如下: using System; using System.Data; using System.Windows.Forms; using CSharpUtilHelpV2; using DevExpress.XtraCharts; namespace DevExpressChart {     public partial class wi

  • DevExpress之ChartControl实现时间轴实例

    本文实例讲述了DevExpress采用ChartControl实现时间轴的方法,分享给大家供大家参考.具体实现方法如下: 关键代码如下: 复制代码 代码如下: using System; using System.Data; using System.Windows.Forms; using DevExpress.XtraCharts; namespace DevExpressChart {     public partial class winDateTime : Form     {   

  • WinForm使用DecExpress控件中的ChartControl插件绘制图表

    目录 1.绘制图表基本步骤 准备数据并绑定 根据数据创建图形展现 根据图形对象创建一个图表并绑定到CharControl中 调用函数绘制图表 2.柱状图 准备数据 创建图形展现对象方法 根据图形对象创建图表 3.饼状图 准备数据 创建一个饼状图 设置饼状图显示方式(数值/百分比) 最近因为公司项目需要用到WinForm的DecExpress控件,在这里把一些使用方法总结一下. DevExpress中有一个专门用来绘制图表的插件ChartControl,可以绘制折线图.饼状图.柱状图等图表. 1.

  • asp.net使用Repeater控件中的全选进行批量操作实例

    本文实例讲述了asp.net使用Repeater控件中的全选进行批量操作的方法.分享给大家供大家参考.具体分析如下: 今天在Repeater控件中碰到一个全选的操作,于是上网查了一下,找到一个觉得比较好,便记录下来, 界面代码简化之后(全选操作): 复制代码 代码如下: <script type="text/javascript"> function SelectAll(parentChk, ChildId, bigControlID) { var oElements =

  • C#实现读取DataSet数据并显示在ListView控件中的方法

    本文实例讲述了C#实现读取DataSet数据并显示在ListView控件中的方法.分享给大家供大家参考.具体如下: /*lvStudentList为ListView控件名 */ DataSet ds = new DataSet(); ds = student.QueryStudents(); //查询表的信息 int rowCount, columnCount,i,j; rowCount = ds.Tables[0].Rows.Count; columnCount = ds.Tables[0].

  • UIWebView控件中字体大小和字体样式的修改

    修改UIWebView控件中字体的样式: NSString *htmlString = [NSString stringWithContentsOfFile:self.webPath encoding:NSUTF8StringEncoding error:nil]; UIFont *font = [UIFont systemFontOfSize:12]; NSString *newHtmlString = [NSString stringWithFormat:@"<font face='%

  • 在Web用户控件中引用样式表中样式的方法

    如何在Web用户控件中引用样式表中的样式 复制代码 代码如下: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="gl1.ascx.cs" Inherits="admin_gl1" EnableTheming="True" %> < link href="../App_Themes/qiantai.css&quo

  • 实现DataGridView控件中CheckBox列的使用实例

    复制代码 代码如下: /// <summary>        /// 实现DataGridView控件中CheckBox列的使用        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void dgvTradList_Ce

  • datagrid和repeader控件中替换标识值的方法

    DataGrid控件中替换标识值的使用: <asp:DataGrid ID="dgList" runat="server" Width="100%" AutoGenerateColumns="False"> <Columns> <asp:BoundColumn DataField="COP_G_NO" HeaderText="物料号/成品货号"><

  • Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)

    在5.2.1节和5.2.2节介绍了<a>标签以及TextView自动识别的特殊文本(网址.电话号.Email等),这些都可以通过单击来触发不同的动作.虽然这些单击动作已经可以满足大多数需要了,但如果读者想在单击链接时执行任意自定义的动作,那么本节的内容非看不可. 现在让我们使用5.2.1节介绍的方法重新查看Html.java文件的内容,随便找一个处理Html标签的方法,例 如,endA方法.该方法用于处理</a>标签.我们会发现在该方法中如下的语句. text.setSpan(ne

  • c#打印预览控件中实现用鼠标移动页面功能代码分享

    该功能本来可以通过拉动水平和垂直滚动条来实现,但实际使用中,用户更趋向于直接用鼠标拖动页面来实现,很多看图类软件都有这种类似的功能.而.net的打印预览控件却很遗憾的没有提供这一功能,只来自己想办法来实现啦. 我的办法就是用代码来控制打印预览控件中的水平来垂直滚动条的位置,间接实现和用鼠标直接拖动滚动条一样的效果. 在实现这一功能的过程中,最大的困难是打印预览控件并没有让程序员直接调用的关于滚动条的方法或属性.所以只好向WinAPI求助了. 以下API函数和常量就是实现上述功能的关键了: 复制代

  • C++获得其他程序窗体控件中信息的方法

    本文实例讲述了C++获得其他程序窗体控件中信息的方法.分享给大家供大家参考.具体分析如下: 这里演示了获得其他程序窗体控件信息的方法, 用FindWindow API找到文本框句柄,用SendMessage(WM_GETTEXT)获得文本 #include <windows.h> BOOL CALLBACK EnumChildProc(HWND hWnd,LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev

随机推荐