前不久,公司举办了15周年庆,其中添加了一个抽奖环节,要从在读学员中随机抽取幸运学员,当然,这个任务就分到了我这里。

  最后的效果如下,启动有个欢迎页面,数据是来自Excel的,点击开始则上面的学号及姓名等信息开始随机滚动,显示区域自适应长度变化等。

  点击停止则停止滚动,将抽取的学员信息用Graphics绘制到当前窗体结果区域中:

 

 用到的知识点:

1. DevExpress的GaugeControl的使用

2. DevExpress的TreeList的使用

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数组:

  1. this.treeList_LuckyUser.Nodes.Add(new String[]{ 第一列, 2列, 第三列 });

  是不是和TreeView的一样?呵呵。这个就不多说了。

3. 输入汉字获取其拼音显示

  这个我前面发过一篇博客有详细介绍,请查看《汉字转拼音 - 输入汉字获取其拼音》。

4. 读取Excel

  读取Excel的方式和连接SQL Server读取数据是基本一致的,只不过使用的是 using System.Data.OleDb; 命名空间,大概代码如下:

  1. DataTable dt = new DataTable(); // 初始化DataTable,用于存储数据
  2. using (OleDbConnection conn = new OleDbConnection(excelPath))
  3. {
  4. string sql = "select * from [表名$]";
  5. OleDbDataAdapter sda = new OleDbDataAdapter(sql, conn);
  6. sda.Fill(dt);
  7. }

  是不是基本一致?详细的大家可以上网搜索相关资料,非常多的示例程序,一定注意:表名后面加$。

5. 示例代码

  在这里我把主窗体的所有代码贴出来吧:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using System.Configuration;
  11. using Microsoft.Office.Interop.Excel;
  12. using System.Data.OleDb;
  13. using System.Threading;
  14. using DevExpress.XtraEditors;
  15. using Microsoft.International.Converters.PinYinConverter;
  16.  
  17. namespace Guying.LuckyApp
  18. {
  19. public partial class FrmMain : XtraForm
  20. {
  21. // Excel数据源
  22. private static readonly string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"]; // 数据库连接字符串
  23. private static readonly string DBPath = ConfigurationManager.AppSettings["DBPath"]; // 数据库路径
  24. private static readonly string FormBottomCopyRights = ConfigurationManager.AppSettings["FormBottomCopyRights"]; // 窗体底部版权信息
  25. private static readonly string FormTitleText = ConfigurationManager.AppSettings["FormTitleText"]; // 窗体标题文本
  26.  
  27. ChineseChar chineseChar = null;
  28. Random _Random = new Random();
  29.  
  30. private List<int> luckyNumbers = new List<int>(); // 幸运号
  31.  
  32. private System.Data.DataTable datas = null; // 所有数据
  33. private bool isStart = false;
  34.  
  35. #region 窗体构造
  36. /// <summary>
  37. /// 窗体构造
  38. /// </summary>
  39. public FrmMain()
  40. {
  41. InitializeComponent();
  42. this.Text = FormTitleText;
  43.  
  44. datas = new System.Data.DataTable(); // 初始化数据集
  45.  
  46. string excelPath = ConnectionString + System.Windows.Forms.Application.StartupPath + "\\" + DBPath; // 构造完整的数据库连接字符串
  47.  
  48. // 创建连接并读取数据
  49. using (OleDbConnection conn = new OleDbConnection(excelPath))
  50. {
  51. string sql = "select * from [Student$]";
  52. OleDbDataAdapter sda = new OleDbDataAdapter(sql, conn);
  53. sda.Fill(datas);
  54. }
  55. }
  56. #endregion
  57.  
  58. #region 窗体加载
  59. /// <summary>
  60. /// 窗体加载
  61. /// </summary>
  62. /// <param name="sender"></param>
  63. /// <param name="e"></param>
  64. private void FrmMain_Load(object sender, EventArgs e)
  65. {
  66. this.toolStripStatusLabel_CopyRights.Text = FormBottomCopyRights;
  67. }
  68. #endregion
  69.  
  70. #region 点击搜索按钮
  71. /// <summary>
  72. /// 点击搜索按钮
  73. /// </summary>
  74. bool starting = false;
  75. private void btnGo_Click(object sender, EventArgs e)
  76. {
  77. this.isStart = true;
  78. starting = !starting;
  79.  
  80. if (starting)
  81. {
  82. ; // 随机产生幸运号
  83.  
  84. ranNum = _Random.Next(, this.datas.Rows.Count); // 产生随机数
  85. // 如果已经存在
  86. while (this.luckyNumbers.Contains(ranNum))
  87. {
  88. ranNum = _Random.Next(, this.datas.Rows.Count); // 重新生成随机数
  89. }
  90. luckyNumbers.Add(ranNum);
  91.  
  92. ;
  93. this.timer.Start(); // 开始滚动显示
  94. }
  95. }
  96. #endregion
  97.  
  98. #region Timer,用于滚动幸运数字
  99. private void timer_Tick(object sender, EventArgs e)
  100. {
  101. string luckyName = string.Empty;
  102. string luckyGrade = string.Empty;
  103. string luckyNumber = string.Empty;
  104. string luckyNamePinYin = string.Empty;
  105.  
  106. if (!starting)
  107. {
  108. this.timer.Stop();
  109.  
  110. ];
  111.  
  112. luckyName = ].ToString();
  113. luckyGrade = ].ToString();
  114. luckyNumber = ].ToString();
  115. this.digitalGauge_Name.Text = GetPinYin(luckyName);
  116. this.digitalGauge_Name.DigitCount = GetPinYin(luckyName).Length;
  117. this.digitalGauge_Number.Text = luckyNumber;
  118. this.digitalGauge_Number.DigitCount = luckyNumber.Length;
  119.  
  120. DrawInformation(luckyName, luckyGrade); // 画出姓名及班级信息
  121.  
  122. ).ToString(), luckyName, luckyGrade });
  123.  
  124. this.btnGo.Enabled = true;
  125. return;
  126. }
  127. , this.datas.Rows.Count); // 产生随机数
  128.  
  129. // 生成当前随机得到的人员信息
  130. luckyNumber = ].ToString(); // 学号
  131. luckyName = ].ToString(); // 姓名
  132. luckyGrade = ].ToString(); // 班级
  133. luckyNamePinYin = GetPinYin(luckyName);
  134. this.digitalGauge_Number.Text = luckyNumber;
  135. this.digitalGauge_Number.DigitCount = luckyNumber.Length;
  136. this.digitalGauge_Name.Text = luckyNamePinYin;
  137. this.digitalGauge_Name.DigitCount = luckyNamePinYin.Length;
  138.  
  139. DrawInformation(luckyName, luckyGrade); // 画出姓名及班级信息
  140. }
  141. #endregion
  142.  
  143. #region 画出姓名及班级信息
  144. /// <summary>
  145. /// 画出姓名及班级信息
  146. /// </summary>
  147. /// <param name="luckyName">姓名</param>
  148. /// <param name="luckyGrade">班级</param>
  149. private void DrawInformation(string luckyName, string luckyGrade)
  150. {
  151. Graphics graphics = this.panelControl_LuckyResult.CreateGraphics();
  152. System.Drawing.Font fontName = , FontStyle.Bold);
  153. System.Drawing.Font fontGrade = , FontStyle.Bold);
  154. Brush brush = , , ));
  155. graphics.Clear(this.panelControl_LuckyResult.BackColor);
  156. graphics.DrawString(luckyName, fontName, brush, , ));
  157. graphics.DrawString(luckyGrade, fontGrade, brush, , ));
  158. }
  159. #endregion
  160.  
  161. #region Timer:用于动态显示当前时间
  162. /// <summary>
  163. /// Timer:用于动态显示当前时间
  164. /// </summary>
  165. /// <param name="sender"></param>
  166. /// <param name="e"></param>
  167. private void timer_TimeNow_Tick(object sender, EventArgs e)
  168. {
  169. string time = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
  170. this.toolStripStatusLabel_CopyRights.Text = FormBottomCopyRights + "  " + time;
  171. if (!this.isStart)
  172. {
  173. this.digitalGauge_Number.Text = time;
  174.  
  175. DrawInformation("智创英杰", "15周年庆 抽奖活动");
  176. }
  177. }
  178. #endregion
  179.  
  180. #region 汉字转化为拼音
  181. /// <summary>
  182. /// 汉字转化为拼音
  183. /// </summary>
  184. /// <param name="source">汉字</param>
  185. /// <returns>全拼</returns>
  186. private string GetPinYin(string source)
  187. {
  188. string result = string.Empty;
  189. foreach (char item in source)
  190. {
  191. try
  192. {
  193. chineseChar = new ChineseChar(item);
  194. ].ToString();
  195. t = t.Substring(, t.Length - );
  196. result += t.Substring(, ).ToUpper() + (t.Length > ? t.Substring().ToLower() : "");
  197. }
  198. catch
  199. {
  200. result += item.ToString();
  201. }
  202. result += " ";
  203. }
  204. , );
  205. }
  206. #endregion
  207. }
  208. }

主窗体所有代码

  好了,差不多了,其实GaugeControl里面还有很多标尺组件,大家自己下去玩玩吧,代码已经贴出来了,有什么不懂的或者需要程序源码的 留言邮箱就OK了~

  最后,谢谢大家的支持,觉得好的话,不要忘了点赞哈。O(∩_∩)O~

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码的更多相关文章

  1. Winform中DevExpress的TreeList的入门使用教程(附源码下载)

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

  2. 编写轻量ajax组件03-实现(附源码)

    前言 通过前两篇的介绍,我们知道要执行页面对象的方法,核心就是反射,是从请求获取参数并执行指定方法的过程.实际上这和asp.net mvc框架的核心思想很类似,它会解析url,从中获取controll ...

  3. .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]

    经过两天的学习,把常用的组件都学习了一遍,并做成了App 学习可能真没有捷径,跟学习html有点类似,都是一个控件一个控件学习并使用,最后拼凑成一个系统 链接:http://pan.baidu.com ...

  4. Winforn中DevExpress的TreeList中显示某路径下的所有目录和文件(附源码下载)

    场景 Winform中DevExpress的TreeList的入门使用教程(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  5. 近期热门微信小程序demo源码下载汇总

    近期微信小程序demo源码下载汇总,乃小程序学习分析必备素材!点击标题即可下载: 即速应用首发!原创!电商商场Demo 优质微信小程序推荐 -秀人美女图 图片下载.滑动翻页 微信小程序 - 新词 GE ...

  6. ASP.NET程序读取二代身份证(附源码)

    原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...

  7. 日志组件Log2Net的介绍和使用(附源码开源地址)

    Log2Net是一个用于收集日志到数据库或文件的组件,支持.NET和.NetCore平台. 此组件自动收集系统的运行日志(服务器运行情况.在线人数等).异常日志.程序员还可以添加自定义日志. 该组件支 ...

  8. C#进阶系列——一步一步封装自己的HtmlHelper组件:BootstrapHelper(三:附源码)

    前言:之前的两篇封装了一些基础的表单组件,这篇继续来封装几个基于bootstrap的其他组件.和上篇不同的是,这篇的有几个组件需要某些js文件的支持. 本文原创地址:http://www.cnblog ...

  9. 使用 SVG 制作单选和多选框动画【附源码】

    通过 JavaScript 实现 SVG 路径动画,我们可以做很多花哨的东西.今天我们要为您介绍一些复选框和单选按钮效果.实现的主要思路是隐藏原生的输入框,使用伪元素创造更具吸引力的样式,输入框被选中 ...

随机推荐

  1. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  2. CSS Position 定位属性

    本篇文章主要介绍元素的Position属性,此属性可以设置元素在页面的定位方式. 目录 1. 介绍 position:介绍position的值以及辅助属性. 2. position 定位方式:介绍po ...

  3. nodejs进阶(2)—函数模块调用

    函数调用 1. 文件内普通函数调用 创建一个js文件命名为2_callFunction.js,其中定义一个函数fun1,向返回对象输出了一段字符串“你好,我是fun1”. //------------ ...

  4. Oracle Database 12c Data Redaction介绍

    什么是Data Redaction Data Redaction是Oracle Database 12c的高级安全选项之中的一个新功能,Oracle中国在介绍这个功能的时候,翻译为“数据编纂”,在EM ...

  5. angular2系列教程(十一)路由嵌套、路由生命周期、matrix URL notation

    今天我们要讲的是ng2的路由的第二部分,包括路由嵌套.路由生命周期等知识点. 例子 例子仍然是上节课的例子:

  6. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  7. 获取微软原版“Windows 10 推送器(GWX)” 卸载工具

    背景: 随着Windows 10 免费更新的结束,针对之前提供推送通知的工具(以下简称GWX)来说使命已经结束,假设您还未将Windows 8.1 和Windows 7 更新到Windows 10 的 ...

  8. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  9. 代码的坏味道(15)——冗余类(Lazy Class)

    坏味道--冗余类(Lazy Class) 特征 理解和维护类总是费时费力的.如果一个类不值得你花费精力,它就应该被删除. 问题原因 也许一个类的初始设计是一个功能完全的类,然而随着代码的变迁,变得没什 ...

  10. [数据结构]——堆(Heap)、堆排序和TopK

    堆(heap),是一种特殊的数据结构.之所以特殊,因为堆的形象化是一个棵完全二叉树,并且满足任意节点始终不大于(或者不小于)左右子节点(有别于二叉搜索树Binary Search Tree).其中,前 ...