news 2026/6/23 6:08:16

基于.NET的Windows窗体编程之WinForms时间控件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于.NET的Windows窗体编程之WinForms时间控件

在软件开发中,有时候需要收集日期或者时间等内容,这时通常会用到时间控件,今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中时间控件,进度条,定时器,BackgroundWorker的相关应用,仅供学习分享使用,如有不足之处,还请指正。

概述

在WinForm窗体开发中,与时间相关的控件主要有以下几种:

  • DateTimePicker ,此控件允许用户从日期或时间列表中选择单个项。 用于表示日期时,它会显示在两个部分:一个下拉列表,其中包含一个以文本表示的日期,以及单击列表旁边的向下箭头时显示的网格。
  • MonthCalendar ,此控件提供直观的图形界面,供用户查看和设置日期信息。 该控件显示一个网格,其中包含月份的编号天数,按一周中的天数下的列排列。 可以通过单击月份标题两侧的箭头按钮来选择其他月份。
  • ProgressBar,此控件通过显示水平条中排列的适当数量的矩形来指示某项操作的进度。
  • Timer ,此组件又称之为“定时器组件”一种按固定事件间隔引发事件的组件,通过Timer控件,可以定时执行某些操作。
  • BackgroundWorker ,此组件使窗体或控件能够异步运行操作 。

说明:MonthCalendar 可以选择日期范围;但是,而DateTimePicker 控件允许设置时间和日期,接下来分别介绍各个组件的使用方法。

DateTimePicker

DateTimePicker 控件允许用户从日期或时间列表中选择单个项。 用于表示日期时,它会显示在两个部分:一个下拉列表,其中包含一个以文本表示的日期,以及单击列表旁边的向下箭头时显示的网格。如果希望 DateTimePicker 控件显示为用于选取或编辑时间而不是日期的控件,请将 ShowUpDown 属性设置为true该属性,并将 Format 属性设置为 Time。DateTimePicker控件的关键属性如下所示:

  • ShowCheckBox,当此属性设置为true时,会在控件左侧显示一个复选框,当勾选时,才可以更新控件的值;如果没有勾选,则控件不可用。
  • MinDate,表示控件可以选择的最小日期;
  • MaxDate,表示控件可以选择的最大日期。
  • Value,控件表示的日期/时间的值,它是DateTime类型,可以通过程序设置当前控件的值,也可以获取用户设置的值。
  • Format,用于设置控件显示的日期/时间的格式,它是一个枚举类型,共有四个选项:Long、Short,Time,Custom。 如果选择自定义格式,则必须将 CustomFormat 属性设置为适当的字符串。
  • CustomFormat,用于格式化控件用于显示的日期/时间的自定义格式字符串。
  • ShowUpDown,用于标识当前控件是显示下拉日历,还是数字显示框。

DateTimePicker 的关键事件:

  • ValueChanged,当控件的值发生变化时触发。

首先拖动DateTimePicker控件到Form表单中,并在Form的Load事件中,设置控件的Form为自定义格式,如下所示:

private void FrmDateTime_Load(object sender, EventArgs e) { this.dateTimePicker1.Format = DateTimePickerFormat.Custom; this.dateTimePicker1.CustomFormat = "yyyy-MM-dd HH:mm:ss"; }

运行示例,效果如下所示:

设置ShowUpDown为true时,会在控件的右侧显示上下箭头,选择需要修改的内容,点击上下箭头进行修改,如下所示:

MonthCalendar

MonthCalendar控件提供直观的图形界面,供用户查看和设置日期信息。 该控件显示一个网格,其中包含月份的编号天数,按一周中的天数下的列排列。 可以通过单击月份标题两侧的箭头按钮来选择其他月份。MonthCalendar控价的关键属性如下所示:

  • ShowToday,表示是否在控件的底部显示“今天”日期;
  • ShowTodayCircle,表示是否在“今天”日期前加上圆圈。
  • ShowWeekNumbers,表示是否在每行日期的左侧显示周数(1-52),表示当前是一年中的第几周。
  • CalendarDimensions ,可以水平和垂直显示多个月,如Width=2,Height=2,表示控件上可以一次显示4个月。
  • FirstDayOfWeek,每周的第一天,默认是周日为第一天,它是一个枚举,可选项:Monday,Tuesday,.....,Sunday,Default。
  • BoldedDates,表示需要加粗的显示的日期
  • AnnuallyBoldedDates,表示一年中需要加粗的日期
  • MonthlyBoldedDates,表示需要每个月加粗的显示的日期。
  • SelectionRange控件中选择的日期范围
  • MaxSelectionCount 表示可选择的最大天数。
  • MinDate,表示控件可以选择的最小日期;
  • MaxDate,表示控件可以选择的最大日期。

MonthCalendar的关键事件:

  • DateSelected,当选择日期或范围时触发此事件。

首先拖动MonthCalendar控件到Form表单中,设置控件的CalendarDimensions属性如下所示:

设置控件的DataSelected事件,此事件包含一个DateRangeEventArgs,它包含Start,End属性,用于获取控件选择的起始日期和结束日期,如下所示:

private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e) { this.lblMonth.Text = $"当前选择的是从{e.Start.ToShortDateString()}到{e.End.ToShortDateString()}"; }

运行示例,效果如下所示:

ProgressBar

ProgressBar 控件通过显示水平条中排列的相应矩形数来指示进程的进度。 当过程完成后,进度条会被填满。 进度栏通常用于让用户了解等待进程完成的时间:例如,加载大型文件时。ProgressBar控件的关键属性:

  • Value, 表示已完成操作的进度。
  • Minimum,进度栏可以显示的最小值
  • Maximum。 进度栏可以显示的最大值。
  • Step,表示当调用PeformStep时,当前值的增量。
  • Style,用于设置ProgressBar的样式,分别为Blocks,Continuous,Marquee

首先拖动ProgressBar控件到Form表单中,并在属性窗口中设置属性,如下所示:

ProgressBar的默认效果如下所示:

说明:设置ProgressBar的BackColor,ForeColor好像不起作用。

Timer

Timer 是一种按固定事件间隔引发事件的组件,启用组件后,每个间隔都会引发 Tick 事件。此组件专为 Windows 窗体环境设计。Timer组件的关键属性如下:

  • Interval 时间间隔,以毫秒为单位,本例是1000毫秒。
  • Tick 定时触发的事件,本例对应timer1_Tick事件方法。
  • Start(),Stop() 表示定时器的启动和停止。
  • Enabled 表示定时器是否启用,默认值为 false,需要手动设置为true。

首先拖动Timer控件到Form表单中,它不会在Form表单中直接显示,而是会显示在组件托盘中,设置如下:

定义timer组件的Tick事件,并在事件中编写相应的逻辑,如在状态栏显示当前时间,如下所示:

private void timer1_Tick(object sender, EventArgs e) { this.toolStripStatusLabel1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); }

运行实例,可以发现每隔1秒钟,在状态栏中更新一下当前时间,效果如下所示:

BackgroundWorker

在实际应用中,有许多执行的操作可能需要很长时间才能完成。 例如:

  • 图像下载
  • Web 服务调用
  • 文件下载和上传(包括点对点应用程序)
  • 复杂的本地计算
  • 数据库事务
  • 本地磁盘访问,因为它相对于内存访问的速度较慢

这样的操作可能会导致用户界面在正在运行时阻塞。 而BackgroundWorker则可以解决这种问题, 它使你能够在不同于应用程序主 UI 线程的线程上异步执行耗时操作(即“在后台”)。

BackgroundWorker关键属性,如下所示:

  • WorkerReportsProgress,表示是否更新执行进度。
  • WorkerSupportsCancellation ,表示运行的后台程序是否支持取消。

BackgroundWorker的关键事件,如下所示:

  • DoWork,表示需要在后台执行的功能逻辑。
  • ProgressChanged,表示进度变化时触发此事件。
  • RunWorkerCompleted,表示后台任务执行完成时触发此事件。

接下来模拟一个耗时10秒钟的下载操做,看看是如果完成的。

首先在Form表单中拖入控件,包括两个按钮(btnStart,btnStop),BackgroundWorker组件,状态栏StatusStrip(包括显示状态和进度),如下所示:

首先在Form的Load事件中,初始化按钮状态,如下所示:

private void FrmDownload_Load(object sender, EventArgs e) { this.btnStart.Enabled = true; this.btnStop.Enabled = false; }

开始和停止事件逻辑,如下所示:

private void btnStart_Click(object sender, EventArgs e) { this.backgroundWorker1.RunWorkerAsync(); this.toolStripStatusLabel1.Text = "进行中"; this.toolStripStatusLabel1.ForeColor = Color.Red; this.btnStart.Enabled = false; this.btnStop.Enabled = true; } private void btnStop_Click(object sender, EventArgs e) { if (this.backgroundWorker1.IsBusy) { this.backgroundWorker1.CancelAsync(); this.btnStart.Enabled = true; this.btnStop.Enabled = false; } }

BackgroundWorker的事件逻辑,分别为DoWork事件,用于耗时的下载,ProgressChanged用于进度变化时更新状态栏的进度,RunWorkerCompleted用于后台任务执行完成后更新状态信息,如下所示:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { Download(); } private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { this.toolStripProgressBar1.Value = e.ProgressPercentage; } private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Cancelled) { this.toolStripStatusLabel1.Text = "已取消"; } else { this.toolStripStatusLabel1.Text = "完成"; this.toolStripStatusLabel1.ForeColor = Color.Green; } this.btnStart.Enabled = true; this.btnStop.Enabled = false; } private void Download() { for (int i = 0; i < 100; i++) { //执行下载操作 Thread.Sleep(100); this.backgroundWorker1.ReportProgress(i + 1); } }

在上述方法中,每隔100毫秒调用一次ReportProgress方法上报进度,会自动触发ProgressChanged事件,然后更新状态栏的进度。

运行示例代码,如下所示:

以上就是《基于.NET的Windows窗体编程之WinForms时间控件》的全部内容,旨在抛砖引玉,一起学习,共同进步!!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 6:08:07

小米设备离线AI控制:MiMo Token与OpenClaw本地协议栈实战

1. 这不是“小米官方功能”&#xff0c;而是一套开发者自建的本地化AI交互协议栈先说清楚&#xff1a;MiMo Token Plan 和 OpenClaw 都不是小米公司发布或背书的产品。你在小米官网、小米社区、MIUI设置里绝对找不到“MiMo”“Token Plan”“OpenClaw”这几个词的任何入口。它们…

作者头像 李华
网站建设 2026/6/23 5:57:24

遥感开放词汇分割:Pi-Seg框架的语义引导扰动学习原理与实践

1. 项目背景&#xff1a;遥感图像分割的“词汇墙”与破局之路如果你做过遥感图像的分析&#xff0c;尤其是地物分割&#xff0c;一定对“标注”这件事深恶痛绝。传统的语义分割模型&#xff0c;无论是U-Net、DeepLab还是HRNet&#xff0c;都像是一个个“死记硬背”的优等生。你…

作者头像 李华
网站建设 2026/6/23 5:55:30

无线广播通信下分布式梯度推送的混合矩阵优化设计

1. 项目概述&#xff1a;当分布式学习遇上无线信道瓶颈在分布式机器学习&#xff0c;尤其是联邦学习的实际部署中&#xff0c;我们常常面临一个核心矛盾&#xff1a;一方面&#xff0c;我们希望利用边缘设备&#xff08;如手机、物联网传感器&#xff09;的海量数据和算力进行协…

作者头像 李华
网站建设 2026/6/23 5:40:40

嵌入式调试器核心命令实战:从断点设置到内存操作与自动化脚本

1. 嵌入式调试器&#xff1a;开发者的“手术刀”与“显微镜”在嵌入式开发的战场上&#xff0c;代码一旦烧录进那片小小的硅片&#xff0c;就如同进入了黑盒。程序崩溃了&#xff0c;变量值莫名其妙地变了&#xff0c;内存被意外覆盖了……面对这些问题&#xff0c;仅靠打印日志…

作者头像 李华
网站建设 2026/6/23 5:34:36

Ubuntu 18.04 搭建稳定 Python 编程环境实战指南

1. 项目概述&#xff1a;为什么在 Ubuntu 18.04 服务器上装 Python 3 不是“点几下就完事”的事&#xff1f;你刚买了一台全新的 Ubuntu 18.04 云服务器&#xff0c;SSH 登上去第一反应是python --version——结果弹出Command python not found&#xff1b;再试python3 --versi…

作者头像 李华
网站建设 2026/6/23 5:26:14

Java的java.lang.StackWalker系统诊断

Java的java.lang.StackWalker系统诊断&#xff1a;深入探索堆栈追踪的利器 在Java开发中&#xff0c;系统诊断和问题排查是开发者经常面临的挑战。传统的堆栈追踪方法&#xff08;如Thread.currentThread().getStackTrace()&#xff09;虽然简单&#xff0c;但在性能和灵活性上…

作者头像 李华