DevExpress绘制多重坐标图形
多个Y轴的分析(上边是ChartControl控件、下边是GridControl控件)
- 数据库表结构:
- 现在的想法是将员工编号、基本工资和所属部门编号显示在折线图中,现查询
- 窗体布局如下:
代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraCharts;
using DevExpress.Utils;
using System.Data.SqlClient;
namespace TreeList_test
{
public partial class XtraForm2 : DevExpress.XtraEditors.XtraForm
{
public XtraForm2()
{
InitializeComponent();
}
private void XtraForm2_Load(object sender, EventArgs e)
{
DataTable dt = CreateData();
this.gridControl1.DataSource = dt;
CreateChart(dt);
}
//准备数据内容
private DataTable CreateData()
{
#region 数据库表结构
/*
emp:员工表
empno: 员工编号;
ename: 员工名字;
job: 职位;
mgr: 上司;
hiredate: 入职时间;
sal: 基本工资;
comm: 补贴;
deptno: 所属部门编号;
*/
#endregion
using (SqlConnection con=new SqlConnection("Data Source =.; Initial Catalog = test_10_23; User ID = sa; Password = 123456; Connection Timeout = 10"))
{
string sql = "select empno,sal,deptno from emp";//查找所有员工的薪水
SqlDataAdapter sda = new SqlDataAdapter(sql, con);
DataSet ds = new DataSet();
sda.Fill(ds);
return ds.Tables[0];
}
}
//创建图表图形
private void CreateChart(DataTable dt)
{
#region Series
//创建几个图形的图像
Series series1 = CreateSeries("员工编号",ViewType.Line,dt,0);
Series series2 = CreateSeries("员工薪水", ViewType.Line, dt, 1);
Series series3 = CreateSeries("所属部门编号", ViewType.Line, dt, 2);
#endregion
List<Series> list = new List<Series>() {series1,series2,series3};
chartControl1.Series.AddRange(list.ToArray());
chartControl1.Legend.Visibility = DefaultBoolean.False;
chartControl1.SeriesTemplate.LabelsVisibility = DefaultBoolean.True;
for (int i = 0; i < list.Count; i++)
{
// list[i].View.Color = Color.Black;
CreateAxisY(list[i]);
}
}
//CreateSeries用于创建一个典型的图形
//注意:Series.ArgumentScaleType=ScaleType.Qualitative这句代码必须设置,否则
//默认会把"2005年1月"内容转换为 日期类型,显示不恰当的内容
/// <summary>
/// 根据需要创建一个图形展现
/// </summary>
/// <param name="caption">图形标题</param>
/// <param name="viewType">图形类型</param>
/// <param name="dt">数据DataTable</param>
/// <param name="colIndex">图形数据的列序号</param>
/// <returns></returns>
private Series CreateSeries(string caption, ViewType viewType, DataTable dt, int colIndex)
{
Series series = new Series(caption, viewType);
Type typeH = dt.Columns[0].DataType;
for (int i = 0; i < dt.Rows.Count; i++)
{
// var argument = Convert.ChangeType(dt.Rows[i][0], typeH);//参数名称
// var value = Convert.ChangeType(dt.Rows[i][colIndex], typeof(float));//参数值
string argument = dt.Rows[i][0].ToString();//横坐标,可根据自己需求设置
var value = Convert.ChangeType(dt.Rows[i][colIndex], typeof(double));
series.Points.Add(new SeriesPoint(argument, value));
}
//必须设置ArgumentScaleType的类型,否则默认会转换为日期格式,导致不是希望的格式显示
//也就是说,显示字符串的参数,必须设置类型为ScaleType.Qualitive
series.ArgumentScaleType = ScaleType.Qualitative;
series.LabelsVisibility = DevExpress.Utils.DefaultBoolean.True;//显示标注标签
return series;
}
/// <summary>
/// 创建图表的第二坐标系
/// </summary>
/// <param name="series">Series对象</param>
/// <returns></returns>
private SecondaryAxisY CreateAxisY(Series series)
{
SecondaryAxisY myAxis = new SecondaryAxisY(series.Name);
((XYDiagram)chartControl1.Diagram).SecondaryAxesY.Add(myAxis);
((LineSeriesView)series.View).AxisY = myAxis;
myAxis.Title.Text = series.Name;
myAxis.Title.Alignment = StringAlignment.Far;//顶部对齐
myAxis.Title.Visibility = DefaultBoolean.True;
myAxis.Title.Font = new Font("宋体", 9.0f);
Color color = series.View.Color;//设置坐标的颜色和图标线条颜色一致
myAxis.Title.TextColor = color;
myAxis.Label.TextColor = color;
myAxis.Color = color;
return myAxis;
}
}
}
启动程序:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?