




















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

在WinForm窗体开发中,与时间相关的控件主要有以下几种:
说明:MonthCalendar 可以选择日期范围;但是,而DateTimePicker 控件允许设置时间和日期,接下来分别介绍各个组件的使用方法。
DateTimePicker 控件允许用户从日期或时间列表中选择单个项。 用于表示日期时,它会显示在两个部分:一个下拉列表,其中包含一个以文本表示的日期,以及单击列表旁边的向下箭头时显示的网格。如果希望 DateTimePicker 控件显示为用于选取或编辑时间而不是日期的控件,请将 ShowUpDown 属性设置为 true 该属性,并将 Format 属性设置为 Time。DateTimePicker控件的关键属性如下所示:
DateTimePicker 的关键事件:
首先拖动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的关键事件:
首先拖动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控件到Form表单中,并在属性窗口中设置属性,如下所示:

ProgressBar的默认效果如下所示:

说明:设置ProgressBar的BackColor,ForeColor好像不起作用。
Timer 是一种按固定事件间隔引发事件的组件,启用组件后,每个间隔都会引发 Tick 事件。此组件专为 Windows 窗体环境设计。Timer组件的关键属性如下:
首先拖动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则可以解决这种问题, 它使你能够在不同于应用程序主 UI 线程的线程上异步执行耗时操作(即“在后台”)。
BackgroundWorker关键属性,如下所示:
BackgroundWorker的关键事件,如下所示:
接下来模拟一个耗时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时间控件》的全部内容,旨在抛砖引玉,一起学习,共同进步!!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。