在软件开发中,有时候需要收集日期或者时间等内容,这时通常会用到时间控件,今天我们以一些简单的小例子,简述基于.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时间控件》的全部内容,旨在抛砖引玉,一起学习,共同进步!!