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);
        }
    }
    //------------------------------------------------------------------------------
}

親 UserControl

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 メソッドが実行された瞬間、タイマーの動作が停止します。

フォーム内ではなくフォームで機能する理由について何か関係はありますUserControlか?

前もって感謝します

よろしく、 フランシス P.

4

0 に答える 0