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

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

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

Re[2]: ラベルコントロールの表示更新の条件について


(過去ログ 74 を表示中)

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

■43508 / inTopicNo.1)  ラベルコントロールの表示更新の条件について
  
□投稿者/ かがみ (1回)-(2009/11/11(Wed) 19:20:19)

分類:[C#] 

Microsoft Visual C# .NET   2002を使用。

ボタンクリックにより、1からNまで数字が増えるたびにラベルコントロールの表示が変わっていくことを
実現しようとして、下記のようにしました。
結果は、途中の数字は表示されず、1の次にはforループが回っていると思われる時間が経過してから、
最終値Nが表示されるだけでした。

これはなぜでしょうか?
また、どのようにしたら数字が変化していくことを表示できるでしょうか?
更新が速くて読み取れないことは問題ありません。
ラベル表示が更新される条件を知りたいと思っております。

どなたかお教えいただけないでしょうか。
どうぞよろしくお願いいたします。

private void button1_Click(object sender, System.EventArgs e)
{
 int i;
 int n = int.Parse(textBox1.Text);
 for(i=0; i<n; i++)
 {
   label1.Text = i.ToString(); 
   /*これだと途中の数字をラベル表示しない*/

   LabelDisplay(i); 
   /*Form1クラスのメソッドとして定義してそれを呼んでも途中の数字をラベル表示しない*/			
 }
}

引用返信 編集キー/
■43509 / inTopicNo.2)  Re[1]: ラベルコントロールの表示更新の条件について
□投稿者/ ヴァン (33回)-(2009/11/11(Wed) 19:29:49)
No43508 (かがみ さん) に返信
> Microsoft Visual C# .NET 2002を使用。
>
> ボタンクリックにより、1からNまで数字が増えるたびにラベルコントロールの表示が変わっていくことを
> 実現しようとして、下記のようにしました。
> 結果は、途中の数字は表示されず、1の次にはforループが回っていると思われる時間が経過してから、
> 最終値Nが表示されるだけでした。
>
> これはなぜでしょうか?
> また、どのようにしたら数字が変化していくことを表示できるでしょうか?
> 更新が速くて読み取れないことは問題ありません。
> ラベル表示が更新される条件を知りたいと思っております。
>
> どなたかお教えいただけないでしょうか。
> どうぞよろしくお願いいたします。
>

label1が更新されないだけでしょ。
引用返信 編集キー/
■43510 / inTopicNo.3)  Re[1]: ラベルコントロールの表示更新の条件について
□投稿者/ 北 (42回)-(2009/11/11(Wed) 19:30:18)
No43508 (かがみ さん) に返信
> Microsoft Visual C# .NET 2002を使用。
>
> ボタンクリックにより、1からNまで数字が増えるたびにラベルコントロールの表示が変わっていくことを
> 実現しようとして、下記のようにしました。
> 結果は、途中の数字は表示されず、1の次にはforループが回っていると思われる時間が経過してから、
> 最終値Nが表示されるだけでした。
>
> これはなぜでしょうか?
> また、どのようにしたら数字が変化していくことを表示できるでしょうか?
> 更新が速くて読み取れないことは問題ありません。
> ラベル表示が更新される条件を知りたいと思っております。
>
> どなたかお教えいただけないでしょうか。
> どうぞよろしくお願いいたします。
>
> private void button1_Click(object sender, System.EventArgs e)
> {
>  int i;
>  int n = int.Parse(textBox1.Text);
>  for(i=0; i<n; i++)
>  {
>    label1.Text = i.ToString();
>    /*これだと途中の数字をラベル表示しない*/
>
>    LabelDisplay(i);
>    /*Form1クラスのメソッドとして定義してそれを呼んでも途中の数字をラベル表示しない*/
>  }
> }
>

 label1.Text + = i.ToString();

でどうでしょうか
引用返信 編集キー/
■43511 / inTopicNo.4)  Re[1]: ラベルコントロールの表示更新の条件について
□投稿者/ Hongliang (507回)-(2009/11/11(Wed) 19:32:01)
現状のコードでは、for ループによってメインスレッドを占有しています。
画面描画もメインスレッドで行われるため、メインスレッドが占有されている間は画面更新ができません。
定期的な処理なら Timer を使うのが一般的です。
「重い」処理(とその経過の出力)なら、BackgroundWorker などを使って別スレッドにやらせるのがいいでしょう。
引用返信 編集キー/
■43514 / inTopicNo.5)  Re[1]: ラベルコントロールの表示更新の条件について
□投稿者/ 魔界の仮面弁士 (1382回)-(2009/11/11(Wed) 20:21:10)
No43508 (かがみ さん) に返信
> これはなぜでしょうか?

通常、イベントの処理が完了するまで、画面は更新されません。

そのため、ループ処理中の状況は再描画されず、
ループが完了してから、最後の結果のみが表示される事になります。


> また、どのようにしたら数字が変化していくことを表示できるでしょうか?

Refresh メソッドを呼び出すと、任意のタイミングで
強制的に再描画させることが出来ます。


  private void button1_Click(object sender, System.EventArgs e)
  {
    int n = int.Parse(textBox1.Text);
    for (int i = 0; i <= n; i++)
    {
      label1.Text = i.ToString();
      label1.Refresh();   // 強制描画
    }
  }


■No43511 (Hongliang さん) に返信
> 定期的な処理なら Timer を使うのが一般的です。
ですね。

> 「重い」処理(とその経過の出力)なら、BackgroundWorker などを使って別スレッドにやらせるのがいいでしょう。
でも、今回は BackgroundWorker を使えないのですよね…。

引用返信 編集キー/
■43531 / inTopicNo.6)  Re[2]: ラベルコントロールの表示更新の条件について
□投稿者/ かがみ (2回)-(2009/11/12(Thu) 10:19:57)
皆様どうもありがとうございました。

おかげさまで、

label1.Refresh(); // 強制描画

として、希望の動作をすることができました。

label1.Text += i.ToString();
とすると、動作がとまる(あるいは最終値を100000としていたので、時間がかかっていたのかも知れません。)
ようになりました。

データ計測ハードウエアの制御ソフトウエアを作っており、データ取得ごとに、取得データ数とデータのグラフを
表示させています。ピクチャーボックスでのグラフはデータが1つ増えるごとにグラフを描いていましたが、
ラベルで表示させているデータ数の表示が更新されなかったので、この部分だけ取り出して質問させていただいた次第です。

大変助かりました。ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -