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

DataGridViewの垂直スクロールバーの上下端の矢印ボタンとスクロールボックスの間の領域について

環境/言語:[OS : Windows 7 / 言語 : Visual Basic .NET / .NET Framework : 3.5]
分類:[.NET]

【解決したい問題】

いつも参考にさせていただいております。

DataGridViewのスクロールバーについて質問です。

DataGridViewに1000件のデータを表示しています。
また、タイマーで日時を表示しています。

垂直スクロールバーの上下端の矢印ボタンとスクロールボックスの間の領域を連続してクリックするとタイマーで表示している時間が止まり、解決策がわからず困っています。


以上、ご教授願います。
> また、タイマーで日時を表示しています。
>
> 垂直スクロールバーの上下端の矢印ボタンとスクロールボックスの間の領域を連続してクリックするとタイマーで表示している時間が止まり、解決策がわからず困っています。

タイマーは、System.Windows.Forms.Timerのことでしょうか?
タイマーはどのように使っているのでしょうか?
タイマーのインターバルを細かくして、時間が来たら日時を再表示、なんてことはやっていないでしょうね。
スクロール操作も、タイマーの動作も同一スレッド内で行っていますので、スクロール処理に労力が取られれば、タイマー経過イベントの着手はその分遅延します。
これが「時間が止まる」という現象なのではないでしょうか。
■No31695に返信(イヒさんの記事)

イヒさん、回答ありがとうございます。

> タイマーは、System.Windows.Forms.Timerのことでしょうか?

はい、そうです。

> タイマーはどのように使っているのでしょうか?

FormAとFormBにそれぞれタイマーで表示しています。
FormAにDataGridViewでデータを1000件表示し、FormBは時刻表示だけです。
起動時、FormAとFormBを表示しています。


  1秒タイマーで使用しています。
Private Sub Timer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer.Tick

Label_Title_DateTime.Text = Now.ToString

End Sub

色々、実験して下記のようにしたら、時刻は表示更新しました。

1.スクロールボックスを連続で移動したときの対策

Private Sub DataGridViewDisp_Scroll(ByVal sender As Object, ByVal e As System.Windows.Forms.ScrollEventArgs) Handles DataGridViewDisp.Scroll

      System.Windows.Forms.Application.DoEvents()

End Sub

2.上下端の矢印ボタンとスクロールボックスの間の領域を連続でクリックしたときの対策。

Private Sub DataGridViewDisp_RowPostPaint(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewRowPostPaintEventArgs) Handles DataGridViewDisp.RowPostPaint

System.Windows.Forms.Application.DoEvents()

End Sub

上記の対策を入れたら、時刻は表示更新されました。

しかし、データ数が1000件位で矢印ボタンとスクロールボックスの間の領域をクリックし続けると、ラベル(時刻表示)が消え、データが正常に表示されず、画面操作が不可能になりました。


DoEventsが悪さをしているのでしょうか?
他に良い方法はあるのでしょうか?

ご教授願います。

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