我正在我的 Windows 应用程序中实现进度条控件。这是我的进度条代码的样子。
public partial class ProgressBar : UserControl
{
public event Action OnCommand;
private int _progressInitial = 0;
private int _progressMaximum = 100;
#region :: Member Methods ::
//------------------------------------------------------------------------------
public void Start()
{
_timer.Start();
_progressBar.Value = 0;
if (!_backWorker.IsBusy)
{
_lblProgressText.Text = string.Empty;
_backWorker.RunWorkerAsync();
}
}
//------------------------------------------------------------------------------
public void End()
{
if (_backWorker.WorkerSupportsCancellation)
{
_timer.Stop();
_backWorker.CancelAsync();
}
}
//------------------------------------------------------------------------------
#endregion
public ProgressBar()
{
InitializeComponent();
_progressBar.Maximum = _progressMaximum;
_backWorker.WorkerSupportsCancellation = true;
_backWorker.WorkerReportsProgress = true;
}
//------------------------------------------------------------------------------
private void _backWorker_DoWork(object sender, DoWorkEventArgs e)
{
if (this.OnCommand != null)
this.Invoke((Action)(() => OnCommand()));
if (_backWorker.CancellationPending)
e.Cancel = true;
}
//------------------------------------------------------------------------------
private void _backWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
_lblProgressText.Text = string.Format("{0}%", e.ProgressPercentage);
_progressBar.Value = e.ProgressPercentage;
}
//------------------------------------------------------------------------------
private void _backWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
_progressBar.Value = _progressMaximum;
_lblProgressText.Text = string.Format("{0}%", _progressMaximum);
_timer.Stop();
_timer.Enabled = false;
}
//------------------------------------------------------------------------------
private void _timer_Tick(object sender, EventArgs e)
{
if (_backWorker.IsBusy)
{
_progressInitial += 10;
if (_progressInitial >= _progressMaximum)
_progressInitial = 99;
_backWorker.ReportProgress(_progressInitial);
}
}
//------------------------------------------------------------------------------
}
父用户控件
public partial class Sample : UserControl
{
public Sample()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
progressBar1.Start();
}
private void button2_Click(object sender, EventArgs e)
{
progressBar1.End();
}
private void progressBar1_Command()
{
System.Threading.Thread.Sleep(5000);
}
}
这是一个UserControl
并且在我的后台工作人员中,我对触发事件操作DoWork
的父控件进行了长时间的数据库操作。OnCommand
这个OnCommand
处理程序将包含长数据库操作,这就是为什么我使用计时器来更新进度条一段时间。
如果我直接在表单上使用控件,这很好用
但是如果我在另一个UserControl
用户控件包含的地方使用这个控件
- 开始和结束按钮
- 实现了 OnCommand 事件的 ProgressBar 控件(DB 操作)
OnCommand 方法执行的那一刻,计时器停止计时。
关于它为什么在 Form 而不是在内部工作有什么关系UserControl
吗?
提前致谢
问候,弗朗西斯 P。