DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataGridViewのスクロールバーがおかしくなる

環境/言語:[.NET Framework 2.0]
分類:[.NET]

すいません。同様の現象にはまった方がいらしたら情報をください。

環境/言語:[WindowsXPSP2/C# 2005 Express] 
分類:[.NET] 

DataGridViewについての現象です。
データが格納されているDataTableがあり、
DataView経由でDataGridViewに内容を表示させています
(表示のみです)

コード上からDataTableの行追加/行削除を激しく行うのですが、
その際に縦スクロールバーが表示されていない状態から
表示されている(されるはずの)状態になるとフリーズしてしまいます。
(特に大量に行追加を行った場合に起こる)

フォームが完全にコントロール不能になったり、
縦スクロールバーがあるはずの場所がいっさい再描画されなくなったります。
後者の場合は操作でフォームをリサイズすると再描画されるようになります。

関係有るかどうかわかりませんが、
Tableの行追加/行削除をバックグラウンドのスレッドで行っています。
現象が出ないことも稀にあります。

ご存知の方がいらっしゃったらよろしくお願いいたします。
■No15520に返信(kenさんの記事)
> 関係有るかどうかわかりませんが、
> Tableの行追加/行削除をバックグラウンドのスレッドで行っています。
> 現象が出ないことも稀にあります。

そもそも、GUI コントロールにバインドされている場合、DataSet/DataTable/DataRow の変更も GUI と同一スレッド上で行う必要があります。
行の追加・削除は Control.Invoke メソッドを使って行ってください。
あるいは、BackgroundWorker を使えば簡単になるかも知れません。
この仕様のため、スレッドを使う意味がない可能性もあります。よく吟味してください。
■No15529に返信(Hongliangさんの記事)
> 行の追加・削除は Control.Invoke メソッドを使って行ってください。

うー、なるほど。ありがとうございます。
ちょっと時間が取れ次第試してみたいと思います。

一点質問なのですが、この場合のControl.InvokeのControlって、
DataTableでいいんでしょうか?
DataTableがGUIのスレッドで更新されればDatGridViewも正しく表示されますか?
> 一点質問なのですが、この場合のControl.InvokeのControlって、
> DataTableでいいんでしょうか?
DataTable は Control じゃなくてただのデータストアですよ。
ここの Control は、「Invoke を実行したいスレッド上で作成されたコントロール」です。普通は、フォーム(端的に言えば this)や、あるいは DataTable を表示している DataGridView を使うでしょう。

> DataTableがGUIのスレッドで更新されればDatGridViewも正しく表示されますか?
断言はできませんが、少なくとも原因の一つではあるでしょう。
■No15536に返信(Hongliangさんの記事)

解決しました! ありがとうございました。
一応ソース貼っときます。

delegate void DataTableAddRowCallback(DataTable dt, DataRow dr);
private void DataTableAddRow(DataTable dt, DataRow dr)
{
if (dataGridView.InvokeRequired)
{
DataTableAddRowCallback d = new DataTableAddRowCallback(DataTableAddRow);
Invoke(d, new object[] { dt, dr});
}
else
{
dt.Rows.Add(dr);
}
}

//別スレッドから
DataTableAddRow(dataSet.Tables["TableName"], dataRow);
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板