0

DataGridView を使用して ac# プロジェクトに取り組んでいたところ、問題が発生しました。

基本的に、任意の数の場所から更新され、ボタン列を持つグリッドがあります。

ボタンのクリックを (もちろん) キャプチャし、そのボタンの行の他のセルを含む何かを実行したいと考えています。私の知る限り、クリックをグリッドの行に関連付ける唯一の方法は、EventArgs の RowIndex を使用することです。

私が心配しているのは、ユーザーがクリックしてからイベントが配信されるまでの間でグリッドが変化し、間違った行がクリックされたように見えることです。

これが起こる可能性がありますか、それとも私は妄想的ですか? 可能であれば、イベント引数内のボタンまたは行のいずれかに参照をバインドして、インデックスが変更された場合でも元の行を区別できるようにすることはできますか?

4

1 に答える 1

1

WinForms の GUI コントロールは、UI スレッドに「関連付けられています」。

行をクリックすると、グリッド実装がこれを処理し、クリック処理の一部としてイベントを発生させます - すべて同じ UI スレッド上で。他のスレッドがグリッド コンテンツを変更した場合でも、これを UI スレッドにシリアル化する必要があります (通常、Windows メッセージをバックグラウンドで投稿するかBeginInvoke、WinForms 用語で - まったく同じではありませんが、近いです)。

つまり、同時変更があっても、クリックが既に登録されていれば、UI の更新によってイベントが中断されることはありません。

ただし、ハンドラーの実行中、またはクリックが発生してからイベントが処理されるまでの間に、行がバインドされるデータ オブジェクトがバックグラウンド スレッドによって変更される可能性があることに注意してください。それでも、グリッド UI の更新はシリアル化する必要があり、イベント ハンドラーの後に発生するため、違いはありません。

于 2012-09-24T18:44:40.887 に答える