0

我正在我的 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用户控件包含的地方使用这个控件

  1. 开始和结束按钮
  2. 实现了 OnCommand 事件的 ProgressBar 控件(DB 操作)

OnCommand 方法执行的那一刻,计时器停止计时。

关于它为什么在 Form 而不是在内部工作有什么关系UserControl吗?

提前致谢

问候,弗朗西斯 P。

4

0 回答 0