DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

时间:2022-09-04 09:24:48

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

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

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

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

 用到的知识点:

1. DevExpress的GaugeControl的使用

2. DevExpress的TreeList的使用

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

4. 读取Excel

5. 示例代码

  本来个人就很在意自己写的程序,所以决定,必须高大上!呵呵。

  开始想制作成一个大转盘的形式,先转班级,再转学员。可班级倒好说,但是学员,一个班三十左右学员,一个转盘也放不下啊。即使放进去了,转盘显示也不太好看。所以最后还是放弃了。

  正踌躇间,余光瞄到了旁边的LED灯上面,这种显示方式也不错啊。于是想法就转向了这种形式上面。

  可是直接显示学号 名字 班级的话,界面也太。。。。。那怎么办?唉。。。。。。。哎?!DevExpress中貌似有一个GaugeControl这个组件!哈哈。

  果断打开Visual Studio、找一下,没错,GaugeControl组件中包含非常非常多种标尺控件,如下:

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码 DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

1. DevExpress的GaugeControl的使用

  是不是感觉挺炫?呵呵。在这里面,我们用的就是GaugeControl里面的的第一个组件形式:Digital。选择后添加到窗体中。

  到设计视图中发现:Digital是由两部分组成:DigitalControl容器和里面用于显示的DigitalBackgroundLayerComponent:

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

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

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

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

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

2. DevExpress的TreeList的使用

  TreeList的使用方式和WinForms的TreeView使用基本一致,我说一下怎么添加列就OK了。

  拖拽一个TreeList到窗体中,然后点击右上角菜单-选择Run Designer,然后打开TreeList的设计器,我们先添加如图三列:

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

  使用代码添加列的方式非常简单,模仿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 标尺组件制作抽奖程序 附源码的更多相关文章

  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. &period;Net 转战 Android 4&period;4 日常笔记(9)--常用组件的使用方法&lbrack;附源码&rsqb;

    经过两天的学习,把常用的组件都学习了一遍,并做成了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&period;NET程序读取二代身份证(附源码)

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

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

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

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

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

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

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

随机推荐

  1. WinForm GDI&plus; 资料收集

    UI(User Interface)编程在整个项目开发过程中是个颇为重要的环节,任何好的解决方案若没有良好的用户界面呈现给最终用户,那么就算包含了最先进的技术也不能算是好程序.UI编程体现在两个方面, ...

  2. 【ASP&period;NET Web API教程】6&period;3 内容协商

    本文是Web API系列教程的第6.3小节 6.3 Content Negotiation 6.3 内容协商 摘自:http://www.asp.net/web-api/overview/format ...

  3. &lbrack;RM HA 2&rsqb; Hadoop 2&period;0 ResourceManager HA原理

    继上篇文章验证Cloudera RM HA功能后,现在开始分析Cloudera RM HA的原理. 设计目标 主要目的是为了解决两种问题 计划外的机器挂掉 计划内的如软件和硬件升级等. 架构 流程:两 ...

  4. Redhat6下安装QEMU

    Redhat6下安装QEMU 1.下载QEUM:http://wiki.qemu.org/Download 2.解压qemu-1.6.1.tar.bz2到/tmp目录(也可以是其他目录)下,并进入解压 ...

  5. ORACLE用户操作的一些常用操作总结【weber出品】

    一.创建一个表空间 create tablespace pioneer_data datafile '/u01/datafile/pioneer_datadbf' size 100m autoexte ...

  6. struts2 DMI问题

    最新开始学习struts2,在官网上下载的最新的struts2(2.3.15.2), jar包,在使用动态方法调用的时候老是报错,错误代码如下HTTP Status 404 - There is no ...

  7. Apache介绍

    怎样使用Apache许可证         若用户须要应用Apache许可证,请将下面演示样例使用适当的注视方法包括在作品源文件里,将括号"[]"中的字段以用户自身的区分信息来替换 ...

  8. 安装jar包到本地maven仓库

    1.打开cmd 直接输入一下命令 自己下载的jar包放在d盘根目录下,jar名字叫spring-context-support-3.1.0.RELEASE.jar DgroupId后面写的是group ...

  9. cpio用法详细说明

    1.1 cpio基本介绍 cpio是一个非常古老的归档工具.已逐渐被tar替代,但是有些功能是tar不存在的,所以还是分享下它的用法. cpio - copy files to and from ar ...

  10. Python 笔记(一)字典与json使用及注意点

    个人笔记系列,随便参考 1.python 中字典与json的差别 字典的生成 >>> a = dict(one=1, two=2, three=3) >>> b = ...