C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C# ある処理を一括におこなうには?


(過去ログ 141 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■82775 / inTopicNo.1)  C# ある処理を一括におこなうには?
  
□投稿者/ John (1回)-(2017/02/03(Fri) 16:05:57)

分類:[C#] 

ある一連の処理を行うコードがあります。
このコードを一括で実行したいです。
(なんという言葉を使えばよいかわからないので、これもよければ教えてください。)

以下のコードにおいて、update_status()はtimerで周期的(例えば、3秒後毎)によばれ、
dataGrid_status の内容を更新します。
更新する際に、一度すべてのRowsをクリア(*1)してから、
Rowsを追加(*2)していきます。

(*1) か (*2)の間で、タスクスイッチが入ってしまうせいか、
たまにdataGridのtableがクリアされたままで、
数秒後にtableが追加される問題が発生しており、
これを解決したいとおもっております。

そこで、(*1) から (*2)までの処理をタスクスイッチなどせず、
一気に実行するような方法はC#にはありませんでしょうか?

Webで探しているのですが、うまく探せおりません。
もしご存じの方がいらっしゃいましたら、ヒントをいただけると
大変助かります。

------------------------------------------
update_status() {

	...
	dataGrid_status.Rows.Clear();  <- (*1)

	...
	foreach (hoge hog in list)
	{
		...
		 	a = xxx
		 	b = xxx
		 	c = xxx
		 	d = xxx

			dataGrid_status.Rows.Add(a, b, c, d);  <-(*2)
	}
}
------------------------------------------

引用返信 編集キー/
■82776 / inTopicNo.2)  Re[1]: C# ある処理を一括におこなうには?
□投稿者/ はるかぜ (6回)-(2017/02/03(Fri) 16:15:13)
No82775 (John さん) に返信

色々な方法があると思いますが、DataGridViewにlistをバインドしてやればlistの内容が変更されると同時にグリッドの表示も変わってくれるはずなので
クリア→追加の処理自体が要らなくなるはずです。

もしくは
http://dobon.net/vb/dotnet/control/beginupdate.html
こちらで紹介されているコントロールの描画を停止→再開させる方法で、
Clear()実行前に停止、全ての追加処理が終わった後に描画を再開させることで見た目上はグリッドがクリアされたようには見えなくなります。
引用返信 編集キー/
■82777 / inTopicNo.3)  Re[2]: C# ある処理を一括におこなうには?
□投稿者/ 魔界の仮面弁士 (1108回)-(2017/02/03(Fri) 16:31:38)
No82776 (はるかぜ さん) に返信
> DataGridViewにlistをバインドしてやればlistの内容が変更されると同時にグリッドの表示も変わってくれるはずなので

バインドされている list が変更通知機能を有していない場合、
変更結果が DataGridView に直ちに反映されません。

変更通知を備えたデータソースとしては、DataBindingSource や DataView などがあります。
https://msdn.microsoft.com/ja-jp/library/xz45s2bh.aspx


変更通知を持たないデータソースの場合は、データソースの内容を
更新した後で、dataGridView1.Invalidate(); を逐次呼びだして、
再描画を促すという手も使えます。
(行の追加や削除を含む場合は、DataSource を再セットした方が良いかも)
引用返信 編集キー/
■82778 / inTopicNo.4)  Re[3]: C# ある処理を一括におこなうには?
□投稿者/ John (2回)-(2017/02/03(Fri) 17:35:57)
はるかぜさん、魔界の仮面弁士さん、
返信ありがとうございました。


>もしくは
>http://dobon.net/vb/dotnet/control/beginupdate.html
>こちらで紹介されているコントロールの描画を停止→再開させる方法で、
>Clear()実行前に停止、全ての追加処理が終わった後に描画を再開させることで見た目上はグリッドがクリアされたようには見えなくなります。
datagridviewには、"BeginUpdate, EndUpdate"メソッドがないようなので、
"WM_SETREDRAWメッセージを使用する方法"を実施してみましたが、
問題は解決しませんでした。なんでだろう。。コードが古いのかな。。

>変更通知を持たないデータソースの場合は、データソースの内容を
>更新した後で、dataGridView1.Invalidate(); を逐次呼びだして、
>再描画を促すという手も使えます。
>(行の追加や削除を含む場合は、DataSource を再セットした方が良いかも)

こちらも試したのですが(Invalidate()とRefresh()を試しました)、
問題は解決しませんでした。これらの関数を呼び出しても、すぐに描画されないみたいで
す。。。

試しに(*1)のコードを(*2)の直前に持ってくると、この問題は発生しません。
consoleにメッセージを表示して動きを確認しましたが、(*1)と(*2)の実行は一瞬で終わ
るので(数秒もかかっていない)、(*1)を実行した後に描画が発生し、その後(*2)が実行
されてもしばらく描画が発生しない状況のようです。。

>> DataGridViewにlistをバインドしてやればlistの内容が変更されると同時にグリッドの表示も変わってくれるはずなので
>
>バインドされている list が変更通知機能を有していない場合、
>変更結果が DataGridView に直ちに反映されません。
>
>変更通知を備えたデータソースとしては、DataBindingSource や DataView などがあります。
>https://msdn.microsoft.com/ja-jp/library/xz45s2bh.aspx
そうすると、変更通知機能を有したデータソースを使うのがいいんですかね。。

なにかお気づきの点がありましたらコメントいただけると幸いです。

引用返信 編集キー/
■82806 / inTopicNo.5)  Re[4]: C# ある処理を一括におこなうには?
□投稿者/ 作業着プログラマ (8回)-(2017/02/06(Mon) 14:50:29)
No82778 (John さん) に返信

update_status()はタイマーイベントで呼ばれると仮定して、
以下のようにタイマー止めるだけでJohnさんのおっしゃる
一括処理できませんか?
タイマーの周期がupdate_status()の内容によって大幅に
変わったりすることに問題がなければですが。
基本的には、はるかぜさんご指摘の様にバインドして
更新処理をなくしてしまうのが良いとは思いますが。



//-----------------------------------------
private void timer1_Tick(object sender, EventArgs e) {
    timer1.Stop();
    update_status();
    dataGridView1.Invalidate();
    timer1.Start();

}
//-----------------------------------------

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -