私は、テキストボックスとデータグリッドビューを含むWindowsフォームを持っています。テキストボックスのテキストが変更されるとすぐに、datagridviewのデータソースが更新されます。これは、テキストボックスのTextChangedイベントを処理し、データソースに新しいListなどを割り当てることによって行われます。通常、新しいデータソースには1000行以上のデータが含まれています。また、このリストをフェッチするようにDBに照会することも時間がかかる。DataGridViewのマジック
私が驚くほど驚くべきことは、テキストボックスに十分速く入力すると、データグリッドは何度もレンダリングを中断し、最終結果のみをレンダリングすることです。真ん中の結果は完全に無視されます。連続したテキストの変更中に実行中のUIスレッドがビジーであるため、これは意味があります。しかし、なぜ私はまだテキストボックスに入力することができますか?
- TextChange
- データのフェッチ
- リフレッシングのDataGridView(レンダリング/塗装なし)
- TextChange
- データのフェッチ
- リフレッシングのDataGridView(レンダリング/塗装なし)
- ... TextChange
- データを取得中
- DataGridViewのリフレッシュ(最終的なレンダリング/ペインティング)
- 完了。
テキストボックスが別のスレッドにあったようですが、絶対にそうではありません。なぜ誰が知っていますか?
これは本当です。しかし、なぜテキストボックスが実際に入力メッセージを処理するのですか(キー押下メッセージ)、dgvは各キー入力後に自身をレンダリングしませんか? – Alireza
ペイントメッセージは優先順位の低いメッセージで、キューが空の場合にのみ配信されます。 –
ありがとうハンス。 UIスレッド、メッセージループ、メッセージの優先度について詳しく知りたい。あなたの名前を参考にしてください。 – Alireza