- PR -

[VS.NET2005][C#]DataGridViewに表示されるエラーアイコンを変更したい

1
投稿者投稿内容
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-01-25 14:02
【環境】
OS:WindowsXPPro
VS:VS.NET2005
言語:C#
AP:Windowsアプリ

訳あって、DataGridViewCell.ErrTextに値を設定した際に表示されるエラーアイコン(Win32:IDI_ERROR)を感嘆符アイコン(Win32:IDI_EXCLAMATION)に変更しようと考えています。

色々調べて

@DataGridViewCellのプロテクトメソッド「PaintErrorIcon」は、ヘルプによると「現在の DataGridViewCell のエラー アイコンを描画」するらしい

Aエラーアイコンイメージは、DataGridViewCellのパブリックでないメンバ「ErrorBitmap」に格納されているらしい

という事までは突き止めたのですが・・・

@は、DataGridViewCellを継承したクラスで「PaintErrorIcon」をoverrideし、ブレークポイントを貼ってみたのですが、このメソッドが呼ばれている様子が無く、そもそもこのメソッド内でどのようにすればアイコンを変えられるかが判らず・・・

Aは、「ErrorBitmap」のPropertyInfoを調べたところCanWriteがfalseに設定されていて書き換えはできないらしい・・・

と、手詰まりになってしまいました。

同様の悩みにぶつかった事のある方で、解決できた方は居ませんでしょうか?
居りましたら、是非解決方法をご教授願えないでしょうか?
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2007-01-25 16:36
こんにちは。

以前やった仕事でそういった実装をしたことがあります。結局お蔵入りになってしまいまし
たが。
# しかも正確には実装をしたのは私ではなく別の担当者ですけど

そのときのソースをひっぱりだして見てみたところ、
DataGridView(TextBox|CheckBox)Column を継承したクラスを作成し、そのクラ
スの Paint() メソッドをオーバーライドしているようです。
オーバーライドしたメソッドでは base.Paint() を呼び出して通常の描画を行わせたあと
で自分でエラーアイコンを描いていました。
(場所は微調整する必要はあるかもしれませんが)

こんな感じで役に立つでしょうか。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
ベテラン
会議室デビュー日: 2005/05/16
投稿数: 85
お住まい・勤務地: 千葉県在住
投稿日時: 2007-01-25 19:45
ぽぴ王子さん、こんにちは。

Paintメソッドをoverrideして出来ました!!

コード:
protected override void Paint(
	System.Drawing.Graphics graphics,
	System.Drawing.Rectangle clipBounds,
	System.Drawing.Rectangle cellBounds,
	int rowIndex,
	System.Windows.Forms.DataGridViewElementStates cellState,
	object value,
	object formattedValue,
	string errorText,
	System.Windows.Forms.DataGridViewCellStyle cellStyle,
	System.Windows.Forms.DataGridViewAdvancedBorderStyle advancedBorderStyle,
	System.Windows.Forms.DataGridViewPaintParts paintParts)
{
	paintParts = (System.Windows.Forms.DataGridViewPaintParts)(paintParts - System.Windows.Forms.DataGridViewPaintParts.ErrorIcon);

	// Call the base class method to paint the default cell appearance.
	base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState,
		value, formattedValue, errorText, cellStyle,
		advancedBorderStyle, paintParts);

	if (errorText != null && errorText.TrimEnd() != "")
	{
		System.Drawing.Rectangle newRect =
			new System.Drawing.Rectangle(cellBounds.X + cellBounds.Width - 16, cellBounds.Y + 4, 12, 11);

		graphics.DrawIcon(System.Drawing.SystemIcons.Exclamation, newRect);
	}
}



いまのところ、ちょっとアイコンが歪んで見えるかな?・・・っという以外は問題なくどうさしてます。

@は、時と場合によってアイコンを、エラーと警告とに使い分けするところを組み込めれば、期待通りのものができそうです。

ぽぴ王子さん、本当に有難う御座います(^^)
1

スキルアップ/キャリアアップ(JOB@IT)