【解決方法】C#プログレスバーとtimer1を連携させるにはどうすればよいですか?


プログレスバーがいくつかの公開コードで仕事をしている間にタイマーを実行する必要がありますが、それらを一緒に開始したいのですが、どうすればよいですか?
問題は、それらを接続すると機能することですが、一度に1行ずつ実行され、完成したメッセージが各行に送信されます。 プログレスバーが機能している間、プログレスバーの操作が完了するまで時間が秒単位で進むことを望みます。
これは進行状況バーが機能するコードです:

C#
public void righeNere()
      {
          int row_count = dataGridView1.Rows.Count;
          micheleProgressBar1.Maximum = row_count;
          micheleProgressBar1.Step = 1;
          CurrencyManager manager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
          foreach (DataGridViewRow rw in dataGridView1.Rows)
          {
              if (rw.Cells[2].Style.BackColor == Color.White && rw.Cells[3].Style.BackColor == Color.White && rw.Cells[4].Style.BackColor == Color.White
                   && rw.Cells[5].Style.BackColor == Color.White && rw.Cells[6].Style.BackColor == Color.White && rw.Cells[7].Style.BackColor == Color.White)
              {
                  manager.SuspendBinding();
                  rw.Visible = false;
                  manager.ResumeBinding();
                  micheleProgressBar1.PerformStep();
                  MessageBox.Show("Completato", "Messaggio", MessageBoxButtons.OK, MessageBoxIcon.Information);
              }
          }
      }

これは timer2 が動作するコードです:

C#
private void BtnAvvia_Click(object sender, EventArgs e)
        {
            BtnAvvia.Enabled = false;
            BtnFerma.Enabled = true;
            BtnResetta.Enabled = true;
            timer2.Interval = (1000) * (1);
            timer2.Enabled = true;
            timer2.Start();
            startTime = DateTime.Now;
        }
        private void BtnFerma_Click(object sender, EventArgs e)
        {
            BtnFerma.Enabled = false;
            BtnAvvia.Enabled = true;
            BtnResetta.Enabled = true;
            timer2.Stop();
        }
        private void timer2_Tick(object sender, EventArgs e)
        {
            elapsedTime = DateTime.Now - startTime;
            lblContatore.Text = elapsedTime.ToString(@"hh\:mm\:ss\.f");
        }

私が試したこと:

C#
private void BtnAvvia_Click(object sender, EventArgs e)
       {
           BtnAvvia.Enabled = false;
           BtnFerma.Enabled = true;
           BtnResetta.Enabled = true;
           timer2.Interval = (1000) * (1);
           timer2.Enabled = true;
           timer2.Start();
           startTime = DateTime.Now;
           righeNere();
       }
       private void BtnFerma_Click(object sender, EventArgs e)
       {
           BtnFerma.Enabled = false;
           BtnAvvia.Enabled = true;
           BtnResetta.Enabled = true;
           timer2.Stop();
       }
       private void timer2_Tick(object sender, EventArgs e)
       {
           elapsedTime = DateTime.Now - startTime;
           lblContatore.Text = elapsedTime.ToString(@"hh\:mm\:ss\.f");
       }
       public void righeNere()
       {
           int row_count = dataGridView1.Rows.Count;
           micheleProgressBar1.Maximum = row_count;
           micheleProgressBar1.Step = 1;
           CurrencyManager manager = (CurrencyManager)BindingContext[dataGridView1.DataSource];
           foreach (DataGridViewRow rw in dataGridView1.Rows)
           {
               if (rw.Cells[2].Style.BackColor == Color.White && rw.Cells[3].Style.BackColor == Color.White && rw.Cells[4].Style.BackColor == Color.White
                    && rw.Cells[5].Style.BackColor == Color.White && rw.Cells[6].Style.BackColor == Color.White && rw.Cells[7].Style.BackColor == Color.White)
               {
                   manager.SuspendBinding();
                   rw.Visible = false;
                   manager.ResumeBinding();
                   micheleProgressBar1.PerformStep();
                   MessageBox.Show("Completato", "Messaggio", MessageBoxButtons.OK, MessageBoxIcon.Information);
               }
           }
       }

解決策 1

あなたの問題は、バックグラウンド スレッドではなく、UI スレッドですべての作業を行っていることです。 データで BackgroundWorker を使用し、DataGridView で直接作業しないでください。

簡単な Google 検索で: datagridview と backgroundworker の例 – Google 検索[^]

私はこの例を見つけました: VB.Net で BackgroundWorker を使用してデータグリッドを更新する[^]. これは VB ですが、読みやすく、知っておくべきことを示しており、C# に変換するのはそれほど難しくありません。

上記の Google 検索からの別の例を次に示します。 BackgroundWorker を使用した DataGrid – C#[^] – 同じ概念ですが、もう少し複雑な例です。

解決策 2

[SOLVED] バックグラウンドワーカーに感謝します すべてが機能します。

コメント

タイトルとURLをコピーしました