1

を使用した場合、メインスレッド応答していない私はデータソースを通じてのDataTableが移入されているDataGridViewのを持っていると私はセルの書式設定のためのBackgroundWorkerの(バックの色との前景色を使用していますセル)をDataGridViewに追加します。C#のWinフォーム - バックグラウンドワーカー

BackgroundWorker bw = new BackgroundWorker(); 
private void Frm_Find_Load(object sender, EventArgs e) 
{ 
    bw.WorkerSupportsCancellation = true; 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
} 

void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    CheckForValidValues(); 
} 

public bool CheckForValidValues() 
{ 
    dgv.Invoke((MethodInvoker)delegate() 
    { 
     for (int i = 0; i < Dt.Rows.Count; i++) 
     { 
      if (Dt.Rows[0]["Name"].ToString() == Value) 
      { 
        dgv.Rows[i].Cells["Name"].Style.BackColor = Color.FromArgb(255, 192, 192); 
      } 
      else 
      { 
        dgv.Rows[i].Cells["Name"].Style.BackColor = Color.White; 
      } 
      progressBar1.Invoke((MethodInvoker)(() => progressBar1.Value++)); 
     } 
    }); 

    this.Invoke((MethodInvoker)delegate() 
    { 
     BtnShow.Enabled = true; 
     dgv.Enabled = true; 
    }); 
} 

private void btnSave_Click(object sender, EventArgs e) 
{ 
    if (bw.IsBusy == false) 
    { 
      progressBar1.Visible = true; 
      progressBar1.Value = 0; 

      BtnShow.Enabled = false; 
      dgv.Enabled = false; 

      progressBar1.Maximum = dgv.Rows.Count; 

      bw.RunWorkerAsync(); 
    } 
} 

プロセス全体がダウンしている間DataGridViewのはそのため、ユーザーがDataGridViewの中に任意の値を変更傾けるEnabled=falseまま。

ありDataGridViewの中に、通常は15,000行であり、多くの行がフォーマットすること、これは私がそれのためのBackgroundWorkerを使用する理由である、時間がかかり、それが完全に罰金を動作しますが、ユーザが押すようにしようとしたときが有効false datagridview 2回、メインスレッドが応答しなくなり、プログレスバーがフリーズします。

誰も私にそれをどう対処することができますか?

+0

:代わりに、セルの書式設定に、BackgroundWorkerを使用しての

、それはCellFormattingイベントを使用する方が良いでしょうか?アップグレードして 'async/await'を使用する –

+0

@AluanHaddad私はVisual Studio(2008)のobseleteバージョンを使用していますが、なんらかの理由でそれに固執しなければならないことを知っています。 –

答えて

1

Invokeを使用してコード全体を実行しています。つまり、UIスレッドに切り替わり、コードがUIスレッドで実行されているということです。コードは時間がかかるので、UIスレッドをブロックしています。あなたがC#3.0を使用しているのはなぜ

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    //If this is header cell or new row, do nothing 
    if (e.RowIndex < 0 || e.ColumnIndex < 0 || e.RowIndex == dgv.NewRowIndex) 
     return; 

    //If formatting your desired column, perform validation 
    if (e.ColumnIndex == dgv.Columns["Name"].Index) 
    { 
     // Perform validation and change cell back color here. 
    } 
} 
+0

私はこのケースで使用する手がかりがないので、コードスニペットを追加できますか? –

+0

申し訳ありません。 BackgroundFormerが行ったように、「CellFormatting」がどのように呼び出されるか、そしてUIスレッドではどのように動作しないかを理解できません。 –

+0

私はCellFormattingが別のスレッドで実行されるとは言いませんでした。あなたのアプローチでUIがなぜブロックされたのかを教えてきました。また、私はあなたの細胞を整形するためのより良い方法を示した。それを試してみると違いが見えます。 –

0

ボタンがクリックされると、ジョブが完了するまでボタンを無効にしようとしますか?

ジョブが使用Button.enabled =真

行われているときに、誤ったButton.enabled =を使用し、 有効偽のデータグリッドビューの際にユーザーのクリック、あなたのボタン名はボタン1です

を言うことができます

希望があれば幸いです!

+0

ボタンが有効になります= falseクリックして全体の作業が完了するまで(申し訳ありませんが、上記のコードに追加することを忘れてしまいました) –

関連する問題