DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码
前不久,公司举办了15周年庆,其中添加了一个抽奖环节,要从在读学员中随机抽取幸运学员,当然,这个任务就分到了我这里。
最后的效果如下,启动有个欢迎页面,数据是来自Excel的,点击开始则上面的学号及姓名等信息开始随机滚动,显示区域自适应长度变化等。
点击停止则停止滚动,将抽取的学员信息用Graphics绘制到当前窗体结果区域中:

用到的知识点:
3. 输入汉字获取其拼音显示
4. 读取Excel
5. 示例代码
本来个人就很在意自己写的程序,所以决定,必须高大上!呵呵。
开始想制作成一个大转盘的形式,先转班级,再转学员。可班级倒好说,但是学员,一个班三十左右学员,一个转盘也放不下啊。即使放进去了,转盘显示也不太好看。所以最后还是放弃了。
正踌躇间,余光瞄到了旁边的LED灯上面,这种显示方式也不错啊。于是想法就转向了这种形式上面。
可是直接显示学号 名字 班级的话,界面也太。。。。。那怎么办?唉。。。。。。。哎?!DevExpress中貌似有一个GaugeControl这个组件!哈哈。
果断打开Visual Studio、找一下,没错,GaugeControl组件中包含非常非常多种标尺控件,如下:

1. DevExpress的GaugeControl的使用
是不是感觉挺炫?呵呵。在这里面,我们用的就是GaugeControl里面的的第一个组件形式:Digital。选择后添加到窗体中。
到设计视图中发现:Digital是由两部分组成:DigitalControl容器和里面用于显示的DigitalBackgroundLayerComponent:

里面的DigitalBackgroundLayerComponent可以通过ShapeType设置其显示的外观样式,在这里,我们使用的是Style 16:

我们可以通过DigitalControl的DigitCount属性和Text属性,来设置显示的长度和显示的文本内容:

2. DevExpress的TreeList的使用
TreeList的使用方式和WinForms的TreeView使用基本一致,我说一下怎么添加列就OK了。
拖拽一个TreeList到窗体中,然后点击右上角菜单-选择Run Designer,然后打开TreeList的设计器,我们先添加如图三列:


使用代码添加列的方式非常简单,模仿WinForms的TreeView的方式添加就行了,在这里我直接添加的是一个按照顺序的String数组:
this.treeList_LuckyUser.Nodes.Add(new String[]{ 第一列, 第2列, 第三列 });
是不是和TreeView的一样?呵呵。这个就不多说了。
3. 输入汉字获取其拼音显示
这个我前面发过一篇博客有详细介绍,请查看《汉字转拼音 - 输入汉字获取其拼音》。
4. 读取Excel
读取Excel的方式和连接SQL Server读取数据是基本一致的,只不过使用的是 using System.Data.OleDb; 命名空间,大概代码如下:
DataTable dt = new DataTable(); // 初始化DataTable,用于存储数据
using (OleDbConnection conn = new OleDbConnection(excelPath))
{
string sql = "select * from [表名$]";
OleDbDataAdapter sda = new OleDbDataAdapter(sql, conn);
sda.Fill(dt);
}
是不是基本一致?详细的大家可以上网搜索相关资料,非常多的示例程序,一定注意:表名后面加$。
5. 示例代码
在这里我把主窗体的所有代码贴出来吧:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;
using Microsoft.Office.Interop.Excel;
using System.Data.OleDb;
using System.Threading;
using DevExpress.XtraEditors;
using Microsoft.International.Converters.PinYinConverter;
namespace Guying.LuckyApp
{
public partial class FrmMain : XtraForm
{
// Excel数据源
private static readonly string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"]; // 数据库连接字符串
private static readonly string DBPath = ConfigurationManager.AppSettings["DBPath"]; // 数据库路径
private static readonly string FormBottomCopyRights = ConfigurationManager.AppSettings["FormBottomCopyRights"]; // 窗体底部版权信息
private static readonly string FormTitleText = ConfigurationManager.AppSettings["FormTitleText"]; // 窗体标题文本
ChineseChar chineseChar = null;
Random _Random = new Random();
private List<int> luckyNumbers = new List<int>(); // 幸运号
private System.Data.DataTable datas = null; // 所有数据
private bool isStart = false;
#region 窗体构造
/// <summary>
/// 窗体构造
/// </summary>
public FrmMain()
{
InitializeComponent();
this.Text = FormTitleText;
datas = new System.Data.DataTable(); // 初始化数据集
string excelPath = ConnectionString + System.Windows.Forms.Application.StartupPath + "\\" + DBPath; // 构造完整的数据库连接字符串
// 创建连接并读取数据
using (OleDbConnection conn = new OleDbConnection(excelPath))
{
string sql = "select * from [Student$]";
OleDbDataAdapter sda = new OleDbDataAdapter(sql, conn);
sda.Fill(datas);
}
}
#endregion
#region 窗体加载
/// <summary>
/// 窗体加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void FrmMain_Load(object sender, EventArgs e)
{
this.toolStripStatusLabel_CopyRights.Text = FormBottomCopyRights;
}
#endregion
#region 点击搜索按钮
/// <summary>
/// 点击搜索按钮
/// </summary>
bool starting = false;
private void btnGo_Click(object sender, EventArgs e)
{
this.isStart = true;
starting = !starting;
if (starting)
{
; // 随机产生幸运号
ranNum = _Random.Next(, this.datas.Rows.Count); // 产生随机数
// 如果已经存在
while (this.luckyNumbers.Contains(ranNum))
{
ranNum = _Random.Next(, this.datas.Rows.Count); // 重新生成随机数
}
luckyNumbers.Add(ranNum);
;
this.timer.Start(); // 开始滚动显示
}
}
#endregion
#region Timer,用于滚动幸运数字
private void timer_Tick(object sender, EventArgs e)
{
string luckyName = string.Empty;
string luckyGrade = string.Empty;
string luckyNumber = string.Empty;
string luckyNamePinYin = string.Empty;
if (!starting)
{
this.timer.Stop();
];
luckyName = ].ToString();
luckyGrade = ].ToString();
luckyNumber = ].ToString();
this.digitalGauge_Name.Text = GetPinYin(luckyName);
this.digitalGauge_Name.DigitCount = GetPinYin(luckyName).Length;
this.digitalGauge_Number.Text = luckyNumber;
this.digitalGauge_Number.DigitCount = luckyNumber.Length;
DrawInformation(luckyName, luckyGrade); // 画出姓名及班级信息
).ToString(), luckyName, luckyGrade });
this.btnGo.Enabled = true;
return;
}
, this.datas.Rows.Count); // 产生随机数
// 生成当前随机得到的人员信息
luckyNumber = ].ToString(); // 学号
luckyName = ].ToString(); // 姓名
luckyGrade = ].ToString(); // 班级
luckyNamePinYin = GetPinYin(luckyName);
this.digitalGauge_Number.Text = luckyNumber;
this.digitalGauge_Number.DigitCount = luckyNumber.Length;
this.digitalGauge_Name.Text = luckyNamePinYin;
this.digitalGauge_Name.DigitCount = luckyNamePinYin.Length;
DrawInformation(luckyName, luckyGrade); // 画出姓名及班级信息
}
#endregion
#region 画出姓名及班级信息
/// <summary>
/// 画出姓名及班级信息
/// </summary>
/// <param name="luckyName">姓名</param>
/// <param name="luckyGrade">班级</param>
private void DrawInformation(string luckyName, string luckyGrade)
{
Graphics graphics = this.panelControl_LuckyResult.CreateGraphics();
System.Drawing.Font fontName = , FontStyle.Bold);
System.Drawing.Font fontGrade = , FontStyle.Bold);
Brush brush = , , ));
graphics.Clear(this.panelControl_LuckyResult.BackColor);
graphics.DrawString(luckyName, fontName, brush, , ));
graphics.DrawString(luckyGrade, fontGrade, brush, , ));
}
#endregion
#region Timer:用于动态显示当前时间
/// <summary>
/// Timer:用于动态显示当前时间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void timer_TimeNow_Tick(object sender, EventArgs e)
{
string time = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
this.toolStripStatusLabel_CopyRights.Text = FormBottomCopyRights + " " + time;
if (!this.isStart)
{
this.digitalGauge_Number.Text = time;
DrawInformation("智创英杰", "15周年庆 抽奖活动");
}
}
#endregion
#region 汉字转化为拼音
/// <summary>
/// 汉字转化为拼音
/// </summary>
/// <param name="source">汉字</param>
/// <returns>全拼</returns>
private string GetPinYin(string source)
{
string result = string.Empty;
foreach (char item in source)
{
try
{
chineseChar = new ChineseChar(item);
].ToString();
t = t.Substring(, t.Length - );
result += t.Substring(, ).ToUpper() + (t.Length > ? t.Substring().ToLower() : "");
}
catch
{
result += item.ToString();
}
result += " ";
}
, );
}
#endregion
}
}
主窗体所有代码
好了,差不多了,其实GaugeControl里面还有很多标尺组件,大家自己下去玩玩吧,代码已经贴出来了,有什么不懂的或者需要程序源码的 留言邮箱就OK了~
最后,谢谢大家的支持,觉得好的话,不要忘了点赞哈。O(∩_∩)O~
DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码的更多相关文章
- Winform中DevExpress的TreeList的入门使用教程(附源码下载)
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- 编写轻量ajax组件03-实现(附源码)
前言 通过前两篇的介绍,我们知道要执行页面对象的方法,核心就是反射,是从请求获取参数并执行指定方法的过程.实际上这和asp.net mvc框架的核心思想很类似,它会解析url,从中获取controll ...
- .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]
经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com ...
- Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)
场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...
- 近期热门微信小程序demo源码下载汇总
近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...
- ASP.NET程序读取二代身份证(附源码)
原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...
- 日志组件Log2Net的介绍和使用(附源码开源地址)
Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...
- C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)
前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...
- 使用 SVG 制作单选和多选框动画【附源码】
通过 JavaScript 实现 SVG 路径动画,我们可以做很多花哨的东西.今天我们要为您介绍一些复选框和单选按钮效果.实现的主要思路是隐藏原生的输入框,使用伪元素创造更具吸引力的样式,输入框被选中 ...
随机推荐
- Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms
行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...
- Android混合开发之WebView与Javascript交互
前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...
- JavaScript动画-磁性吸附
▓▓▓▓▓▓ 大致介绍 磁性吸附是以模拟拖拽为基础添加一个拖拽时范围的限定而来的一个效果,如果对模拟拖拽有疑问的同学请移步模拟拖拽. 源代码.效果:点这里 ▓▓▓▓▓▓ 范围限定(可视区) 先来看一个 ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- 解读发布:.NET Core RC2 and .NET Core SDK Preview 1
先看一下 .NET Core(包含 ASP.NET Core)的路线图: Beta6: 2015年7月27日 Beta7: 2015年9月2日 Beta8: 2015年10月15日 RC1: 2015 ...
- PHP类和对象之重载
PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...
- Take into Action!
很久没有认真地写文字了. 刚毕业一两年断断续续在csdn上写过一些当时的工作记录,然后没有坚持下去.有时候是觉得自己不牛,记录的东西旁人看起来也许不值一提:有时候觉得结婚生娃了,然后时间不够用(确实是 ...
- Flexible 弹性盒子模型之CSS flex-flow
实例 让弹性盒的元素以相反的顺序显示,且在必要的时候进行拆行: display:flex; flex-flow:row-reverse wrap; 效果预览 浏览器支持 表格中的数字表示支持该属性 ...
- SymmetricDS 快速和灵活的数据库复制
开始谈谈开源的SymmetricDS,谈谈实际使用中,遇到的一些问题和解决办法.持续更新: SymmetricDS 快速和灵活的数据库复制 实际使用 和 埋过的坑 (一)知识篇 SymmetricDS ...
- C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
前言:已经有一个月没写点什么了,感觉心里空落落的.今天再来篇干货,想要学习Webapi的园友们速速动起来,跟着博主一起来学习吧.之前分享过一篇 C#进阶系列——WebApi接口传参不再困惑:传参详解 ...