2011-01-15 6 views
1

ねえ、私は約10項目のdatagridviewを持っています。グリッドから特定のアイテムを削除したい。 Iveがそれを処理している間、各アイテムの削除の実行速度を制御したい、つまり、ユーザーが削除されている各アイテムを見るのに十分に遅くしたい。私は、このコードはそのSTIL速いと一致するすべての項目を一度に削除されたアイテムを削除していますが、このデータグリッドビューから項目を削除する実行速度を制御

for (int i = dataGridView1.Rows.Count - 1; i <= 0; i--){ 
    if (dataGridView.Rows[i] == null){ 
    continue; 
    } 

    if (dataGridView.Rows[i].Cells[3].Value.ToString().Contains("Remove")){ 

    // stop the thread 
    System.Threading.Thread.Sleep(900); 
    dataGridView1.Rows.RemoveAt(i); 
    } 
} 

などの各反復内のスレッドを停止しようとしました。私はタイマーを使ってみましたが、これを達成するには運がありませんでしたか?

+0

削除を 'アニメーション化'したいですか? – leppie

+1

(これは話題にはなりませんが、 'for <ループの条件は' i <= 0'ではなく 'i> = 0'であるべきではないでしょうか?) – stakx

+1

ソフトウェアの頻繁なユーザとして、削除がアニメ化されているのではなく瞬間的であった場合はもっと幸せです。アイテムが削除されたかどうかを判断するために最終結果を見ることができます。私は座って目の前で展開する必要はありません。それをそこに置くだけです。 –

答えて

4

考えられる原因:

私はここでの問題は、すべての行が削除されるまで、あなたforループは残さないことだと思います。つまり、プログラムはGUI(Winforms?)にすべての行が削除されるまで自身を更新する機会を与えません。

あなたのThread.Sleepが(あなたのループ中にまだ残っている)すべてのことが起こり、行を削除するようにスケジューリングしているのです。ループが終了すると、GUIが自動的に更新されます。複数の行が削除予定になっていて、一度にすべて削除されます。

考えられる解決策:

あなたは何ができるかは、削除される行のキューをオフに動作しますバックグラウンドタスクを作成することです。バックグラウンドタスクは、指定された時間だけ待機してからキューを削除します。このステップでは、dataGridView1.Invoke(...)のようなものを使用してUIスレッドをコールバックする必要があります。

最後に、表示されたループを最初の手順でキューに入れるように変更します。ループの後、バックグラウンドタスクを開始します。

例コード:

私はいくつかのスクラッチサンプルコードを表示しようとするでしょう。これは箱からうまくいかないかもしれないことに注意してください、私はそれを完全にチェックしていません。

これは、行削除ループがバックグラウンドで実行されるために有効です。 UIスレッドと平行になります。つまり、UIスレッドは、削除ループが終了するまで待つ必要はありません。行の削除がスケジュールされるたびに、UIスレッドは並行して応答できます。 (dataGridView.Invoke(someAction)への呼び出しは、基本的にUIスレッドのメッセージキューに「この作業を行います(someAction)」というメッセージを挿入します)。

+0

ありがとう私はこれを試して、あなたに結果に関するフィードバックを与えます – Henry

+0

もちろん、問題はUIが更新されていないということです!私自身はそれを考えなかった! –

+0

ワウありがとうございましたalotコードは問題なく動作していますが、送信者と電子メールがボタンの他​​の賢明な点で競合するため、queueWorker.DoWork + =(送信者、e)をqueueWorker.DoWork + =(s、ev)できます。私はすべての努力に感謝します – Henry

0

あなたはそのコードをどこで実行しますか?

おそらく、あなたはDatagridview.Userdeletingrowのようないくつかのイベントについて練習してください。問題の

+0

私はこのコードをボタンの後ろに置いています – Henry

関連する問題