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
、ユーザーコントロールが含まれている別のコントロールの中でこのコントロールを使用すると
- 開始および終了ボタン
- OnCommand イベントが実装された ProgressBar コントロール (DB 操作)
OnCommand メソッドが実行された瞬間、タイマーの動作が停止します。
フォーム内ではなくフォームで機能する理由について何か関係はありますUserControl
か?
前もって感謝します
よろしく、 フランシス P.