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

DataGridViewRowのErrorTextを制御したい

環境/言語:[.NET Framework 2.0 SP2、Visual Studio 2008、VB.NET、Windows XP SP3]
分類:[.NET]

DataGridViewRowのErrorTextにメッセージを登録すると、
アイコン表示され、マウスをあわせると、ツールチップが出ますが、
そのツールチップのプロパティを変更することは出来ないでしょうか?

具体的には、
IsBaloon = True
AutoPopDelay = Integer.MaxValue
などを設定したいと考えています。

<環境>
・.NET Framework 2.0 SP2
・Visual Studio 2008
・VB.NET
・Windows XP SP3

以上、よろしくお願いいたします。

--
@ITにも同じ内容を質問しましたが、回答が得られなかったため、
こちらでも質問させていただきました。
DataGridViewで使用しているToolTipは公開されていませんので、リフレクションを使ってアクセスするしかないでしょう。さらに、

How do I format the tooltip used by a DataGridView in virtual mode? - Stack Overflow
http://stackoverflow.com/questions/487499/how-do-i-format-the-tooltip-used-by-a-datagridview-in-virtual-mode

によると、自分で作成したToolTipをリフレクションを使って設定すれば、DataGridViewでそれが使われるようになるらしいです。実際に以下のようなコードを試してみましたが、うまく行っているように見えました。(DataGridViewで使用しているToolTipをGetValueで取得する方法もありそうですが、いつToolTipが作成されるか分からないため、このように設定してしまう方がいいようです。)

Dim myToolTip As New ToolTip()
myToolTip.IsBalloon = True

Dim toolTipControlFieldInfo As System.Reflection.FieldInfo = _
GetType(DataGridView).GetField("toolTipControl", _
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
Dim toolTipFieldInfo As System.Reflection.FieldInfo = _
toolTipControlFieldInfo.FieldType.GetField("toolTip", _
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.NonPublic)
Dim toolTipControlInstance As Object = toolTipControlFieldInfo.GetValue(dataGridView1)
toolTipFieldInfo.SetValue(toolTipControlInstance, myToolTip)

ただこのToolTipは、セルのToolTipTextなどで表示されるToolTipにも使われます。
2010/04/19(Mon) 20:52:08 編集(投稿者)

■No26725に返信(管理人さんの記事)
リフレクションを使う方法、勉強になりました。
ありがとうございます。

組み込んで、動作確認してみました。
======================================================
Public Class DataGridViewEx : Inherits DataGridView
Public Sub New()
'ツールチップ(DataGridViewが隠蔽しているToolTipを自前のToolTipに置き換え)
Dim myToolTip As New ToolTip
myToolTip.IsBalloon = True '@
myToolTip.InitialDelay = 0 'A
myToolTip.ReshowDelay = 0 'B
myToolTip.AutoPopDelay = 50000 'C

Dim toolTipControlFieldInfo As FieldInfo = GetType(DataGridView).GetField("toolTipControl", BindingFlags.Instance Or BindingFlags.NonPublic)
Dim toolTipFieldInfo As FieldInfo = toolTipControlFieldInfo.FieldType.GetField("toolTip", BindingFlags.Instance Or BindingFlags.NonPublic)
Dim toolTipControlInstance As Object = toolTipControlFieldInfo.GetValue(Me)
toolTipFieldInfo.SetValue(toolTipControlInstance, myToolTip)
End Sub
End Class
======================================================

@の設定により、ちゃんとバルーン表示になったのですが、
A〜Cの設定が無視されているようです。
解決策をご存知ないでしょうか?

また、アイコンの表示されている行の2行ぐらい下に
バルーンが表示されてしまいます。
出来れば、アイコン表示された行にバルーンを表示したいと思います。

以上2件、よろしくお願いいたします。
ToolTipのプロパティの値が実際に変更されているか調べてみていただけますか?私が調べたところでは、InitialDelayが0にされてしまう(はじめから0の時は変わりません)以外は変更されませんでした。

それ以外に関しては、ToolTipクラスの派生クラスを作成することで、対処できないでしょうか?
■No26735に返信(管理人さんの記事)
フォーム描画後のToolTipを調べたところ、プロパティで設定した値に
変更されていることは確認しました。

ToolTip.AutoPopDelayの最大値は32767(環境依存?)であり、
それ以上の値を設定すると、デフォルトの5000として扱われてしまうようです。
そのため、プロパティで設定しているに関わらず、デフォルトのままの挙動を
していたようです。

バルーンが変なところに表示されてしまう問題は、もう少し検討してみます。

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