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

DataGridの行選択処理によるちらつきについて

環境/言語:[Windows2000 VB.NET .NET Framework1.1]
分類:[.NET]

こんばんわ okaと申します。
今悩んでいる処理があるのですが、どうかお知恵をお貸しください。

ProcessCmdKeyをオーバーライドしてTabボタンの押下を取得し、次のコントロールにフォーカスを移動させるDataGridをフォーム上に配置しています。
そのDataGridはReadOnlyで、行選択モードとしてPaintメソッド内で、dgDataGrid.Select(選択行)
の処理を入れています。
ただ、それだけではDataGridからフォーカスが外れた時でも、ずっと行選択されたままとなっているので、これをDataGridのEnterとLeaveのそれぞれのメソッド内で
dgDataGrid.Select(選択行)
dgDataGrid.UnSelect(選択行)
により、DataGridにフォーカスがあたっている時のみ、行選択されているようにしています。

この処理自体はうまくいっている(フォーカスにより行選択がON⇔OFFされる)のですが、DataGridにフォーカスが出入りするタイミングで、画面がちらつきます。
デスクトップ上のアイコンもちらつくので、Formだけでなく、画面全体が再描画されているようなのですが、現状その状況を回避することができません。

このような現象なのですが、対処法をご存知の方がいらっしゃれば、ご教授いただけないでしょうか?
どうかよろしくお願いいたします。
2005/03/30(Wed) 09:42:09 編集(投稿者)

■No10147に返信(okaさんの記事)

okaさん お早うございます。
平ちゃんです。

回答ではないです。
この問題でないことは確認済みでしょうか。


> そのDataGridはReadOnlyで、行選択モードとしてPaintメソッド内で、
>dgDataGrid.Select(選択行)の処理を入れています。
■No10172に返信(平ちゃんさんの記事)

平ちゃんさん、おはようございます。okaです。
そして、レスありがとうございます。

以前平ちゃんさんにかなり助けて頂いたDataGrid関連ですが、また最後に悩まされております・・・。

> 回答ではないです。
> この問題でないことは確認済みでしょうか。
>
>>そのDataGridはReadOnlyで、行選択モードとしてPaintメソッド内で、
> >dgDataGrid.Select(選択行)の処理を入れています。

そのあたりは調べたのですが、自信の程は70%くらいでしょうか。
まず、Paintメソッドごとすべてコメントにしてみました。
結果は変わらず、ちらつきが発生していました。

ちなみにLeaveメソッドでのUnselectの処理を入れなければ、この現象が起こらないことから、選択されている状態と非選択の状態(DataGridのSelectionBackColor)が切り替わる時にちらついていると判断しました。

もし何か解決の手がかりとなるような事をご存知でしたら、教えていただけないでしょうか?些細なことでも結構です。
よろしくお願い致します。
2005/03/30(Wed) 11:21:58 編集(投稿者)

■No10173に返信(okaさんの記事)

>
> そのあたりは調べたのですが、自信の程は70%くらいでしょうか。
> まず、Paintメソッドごとすべてコメントにしてみました。
> 結果は変わらず、ちらつきが発生していました。

それではこの問題ではないとして

>
> ちなみにLeaveメソッドでのUnselectの処理を入れなければ、この現象が起こらないことから、選択されている状態と非選択の状態(DataGridのSelectionBackColor)が切り替わる時にちらついていると判断しました。
>
> もし何か解決の手がかりとなるような事をご存知でしたら、教えていただけないでしょうか?些細なことでも結構です。
> よろしくお願い致します。
>


testとして単純にボタンで切り替えるとどうでしょうか。
私の場合はチラツキませんでした。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGrid1.Select(1)
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
DataGrid1.UnSelect(1)
End Sub


また何か解ればレスします。
■No10174に返信(平ちゃんさんの記事)

okaです。
平ちゃんさん、早速のレスありがとうございます。

> testとして単純にボタンで切り替えるとどうでしょうか。
> 私の場合はチラツキませんでした。
>
> Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
> DataGrid1.Select(1)
> End Sub
>
> Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
> DataGrid1.UnSelect(1)
> End Sub

私の方でも上記テストを行いました。
こちらでは、速い切り替えを行うため1つのボタンで上記の処理を行うようにしてみましたが、それでも平ちゃんさんのご指摘通り、ちらつきが発生しませんでした。
そこで、以下のテストを行いました。

Private bSelect as Boolean

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If bSelect = True Then
Me.Button1.Focus()
bSelect = False
Else
Me.DataGrid1.Focus()
bSelect = True
End If
End Sub

ボタンによってFocusを移動させてみました。
このテストでは、Leaveイベント、EnterイベントにてSelectとUnSelectを実行しています。
結果はちらつきが発生しました。

上記事項より、単にSelectとUnSelectを切り替えるだけでは発生せず、Focus移動によってEnterイベントとLeaveイベント内でSelectとUnselectを切り替える処理を入れるとちらつきが発生するということがわかりました。

しかし、依然として原因と解決策は見えてこない状況です・・・。
もう少し色々テストしてみます。

> また何か解ればレスします。

本当にありがとうございます。ご迷惑お掛けしております。
よろしくお願い致します。
■No10177に返信(okaさんの記事)

okaです。自己レスです。
本日、実環境にてアプリケーションを動かしてみました。
すると、まったく再描画によるちらつきが発生しませんでした???
本当はかなり気持ち悪いですが、とりあえず解決と致します。

平ちゃんさん、ありがとうございました。
解決済み!
2005/03/31(Thu) 00:07:09 編集(投稿者)
2005/03/30(Wed) 23:46:06 編集(投稿者)

■No10187に返信(okaさんの記事)

okaさん こんにちは

> すると、まったく再描画によるちらつきが発生しませんでした???
> 本当はかなり気持ち悪いですが、とりあえず解決と致します。

仰るとおりです。できればスッキリしたいものです。

Enter、Leave、Button1、Button2を次のようにしてテストするとチラツキました。
(Button2とButton1を交互に押すだけです)
私の場合直前にフォーカスのあったセルがちらつきました。
(Button1を押すとチラツキました)
スクロールバーで選択のあったセルを見えなくするとチラツキはなくなります。
DataGrid1.ReadOnly プロパティは関係ありませんでした。

Private Sub DataGrid1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.Leave
DataGrid1.UnSelect(1)
End Sub

Private Sub DataGrid1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.Enter
DataGrid1.Select(1)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGrid1.Focus()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
End Sub



>デスクトップ上のアイコンもちらつくので、Formだけでなく、画面全体が再描画されているようなのですが、現状その状況を>回避することができません。

これに関しては私のほうでは確認できません。
どちらかと言うと信じられない気持ちです。
解決済み!
■No10189に返信(平ちゃんさんの記事)

平ちゃんさん おはようございます。okaです。

やはり、DataGridコントロールに対するFocusの移動時に発生する、LeaveとEnterのイベント内でのSelect,UnSelect処理に問題があるのだと思います。
平ちゃんさんが行われたテスト同様、私の方の前述のテストからも、ちらつきの発生する条件としては、Focusの移動が絡んでいることと、Focus移動なしにSelect,UnSelectの切り替えを行った時にちらつきが発生しないという事から、このような結論に至りました。
しかし、残念ながらその原因究明に至らずという状況には変わりなしです。

> >デスクトップ上のアイコンもちらつくので、Formだけでなく、画面全体が再描画されているようなのですが、現状その状況を>回避することができません。
>
> これに関しては私のほうでは確認できません。
> どちらかと言うと信じられない気持ちです。

確かに、理屈から考えると私もなぜそうなってしまうのかが全くわかりません。
平ちゃんさんの環境と、私が昨日試してみた実環境では発生せず、私の開発環境では発生するということから、単に環境の問題なのかなあとも思ったりするのですが、そこが一番釈然としない所です。

どこまで調査することができるかはわかりませんが、何かわかったことがあれば、本掲示板にて報告させていただきます。

平ちゃんさん、この度は重ね重ねお時間を割いていただき、本当にありがとうございました。
解決済み!
2005/03/31(Thu) 13:56:16 編集(投稿者)

■No10191に返信(okaさんの記事)

okaさん こんにちは

> やはり、DataGridコントロールに対するFocusの移動時に発生する、LeaveとEnterのイベント内でのSelect,UnSelect処理
>に問題があるのだと思います。
> 平ちゃんさんが行われたテスト同様、私の方の前述のテストからも、ちらつきの発生する条件としては、Focusの移動が絡
>んでいることと、Focus移動なしにSelect,UnSelectの切り替えを行った時にちらつきが発生しないという事から、このよう
>な結論に至りました。

これに関しての私の見解はDataGridコントロールにFocusが入るとフォーカスのあるセルがActiveになりちらつく。
Buttonでの切り替えではセルがActiveにならないのでちらつかない。

ですからフォーカスのあるセルが見えている状態ならFocusが入るとちらつくのは仕方のない事だろうと思います。
但しこれは軽微なちらつきです。

okaさんの場合かなり大きなちらつきですので
>こちらでは、速い切り替えを行うため
とありますので数回連続してLeaveとEnterが繰り返されていることはありませんか?

今の所これが気になっています。
解決済み!
■No10193に返信(平ちゃんさんの記事)
> 2005/03/31(Thu) 13:56:16 編集(投稿者)

平ちゃんさん、okaです。
レスありがとうございます。

> これに関しての私の見解はDataGridコントロールにFocusが入るとフォーカスのあるセルがActiveになりちらつく。
> Buttonでの切り替えではセルがActiveにならないのでちらつかない。
>
> ですからフォーカスのあるセルが見えている状態ならFocusが入るとちらつくのは仕方のない事だろうと思います。
> 但しこれは軽微なちらつきです。
>
> okaさんの場合かなり大きなちらつきですので
> >こちらでは、速い切り替えを行うため
> とありますので数回連続してLeaveとEnterが繰り返されていることはありませんか?
>
> 今の所これが気になっています。

たしかに、私の環境では軽微なちらつきという程度ではないので、Focusの出入りが引き金になっている可能性もありですが、それだけではないということですね。
それが何なのか・・・なのです。

今回ご指摘いただきました点について、早速調べてみました。
Leave,EnterともにFocus移動時に1度ずつのみイベントが発生しておりましたので、その点については問題がないようです。
ただ、仮に数回繰り返されていたとして、それがデスクトップまでも再描画してしまうというのが、またまた???となってしまいます。
私のレベルでは迷宮入りなのでしょうかぁ。

しかし、平ちゃんさん今回も大変ありがとうございました。
解決済み!
■No10201に返信(okaさんの記事)

okaさん こんにちは

>
> 今回ご指摘いただきました点について、早速調べてみました。
> Leave,EnterともにFocus移動時に1度ずつのみイベントが発生しておりましたので、その点については問題がないようです。
> ただ、仮に数回繰り返されていたとして、それがデスクトップまでも再描画してしまうというのが、またまた???となってしまいます。
> 私のレベルでは迷宮入りなのでしょうかぁ。


多分何か原因はあると思います。
しかし okaさん 同様私も???です。

もっと詳しい方からアドバイス頂けると思いますので、未解決としときます。
(私も原因を知りたいです)
■No10202に返信(平ちゃんさんの記事)

平ちゃんさん おはようございます。
okaです。

> 多分何か原因はあると思います。
> しかし okaさん 同様私も???です。
>
> もっと詳しい方からアドバイス頂けると思いますので、未解決としときます。
> (私も原因を知りたいです)

はい。幸い前述の通り、実環境では発生しない現象のため、緊急性のない状況となりましたので、私も有力な回答のレスがつくことを願って待ってみたいと思います。

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