[ad_1]
プログレスバーがいくつかの公開コードで仕事をしている間にタイマーを実行する必要がありますが、それらを一緒に開始したいのですが、どうすればよいですか?
問題は、それらを接続すると機能することですが、一度に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] バックグラウンドワーカーに感謝します すべてが機能します。
[ad_2]
コメント