[C#] 画面サイズによってDataGridViewのチェックボックスが表示されない

以前、自作フリーソフトのWindows8対応で、検出済みの勤務時間取得ツールのチェックボックスが消えてしまう問題について調査&修正したときのネタを覚書として書いておくことに。
AutoSizeRowsMode_AllHeaders


実は、このチェックボックスが消えてしまう問題について、似たようなことが、ずーっと前にも発生していた。
DataGridViewにチェックボックスが表示されない
で、何故こんな類似問題が今更出ているのかというと、ディスプレイサイズを100%以外の考慮が足りなかったため。
今までも再現していたんだろうけど、ディスプレイサイズ100%以外については、確認をしていなかった(というかサポート外と決めていた)。
でも、最近のPCって画面が細かすぎて、100%表示だと細かすぎて見にくいし、Windows8のようにマルチタッチできるPCにとっては、1ドットが細かすぎて意図したタッチ操作が困難となってきたため、サイズを少し大きくするため125%がデフォルトとなっているPCが出てきた。
そんな訳で125%などをサポート外とも言いにくい状況になってきたため、修正をすることにした。
125%表示の際、表示が崩れるという問題もあるけど、これはリサイズすれば使えるので、これは問題ない。
問題は、DataGridViewのチェックボックスが表示できないというもの。
チェックしたくてもできない。
以前、調べたときは、FlatStyleプロパティをFlatに変更すればいいという結論だった。
しかし、この方法では125%表示に完全対応できなかった。
どうすれば表示できるのか。
FlatStyleプロパティをFlatにするということは、チェックボックスを若干小さくすると表示されるということ。
列の高さに収まるチェックボックスであれば表示される。
だから、列の高さを変えれば表示することが可能。
そんな訳で、列の高さサイズを調整する DataGridView.AutoSizeRowsMode プロパティをいろいろ弄ってみることにした。
案の定、表示される場合がある。
どんなときに消えてしまうのか、条件が分からなかったんで、動作確認用のプログラムを作り確認してみた。
まずは、ディスプレイサイズ100%表示の場合。
DataGridViewButtonColumn.FlatStyleプロパティがStandardの場合は、AutoSizeRowsModeプロパティがAllHeaders、DisplayedHeadersだとチェックボックスが消えてしまう。
DataGridViewButtonColumn.FlatStyleプロパティがFlatなら、チェックボックスは全て表示される。
だから、前回はFlatStyle=Flatにすることにより解決できていた。
100
今度は、ディスプレイサイズ125%の場合。
DataGridViewButtonColumn.FlatStyleプロパティがStandardの場合は、AutoSizeRowsModeプロパティがAllHeaders、DisplayedHeadersだとチェックボックスが消えてしまう。これは100%のときと変わらない。
しかし、DataGridViewButtonColumn.FlatStyleプロパティがFlatの場合、同じくAutoSizeRowsModeプロパティがAllHeaders、DisplayedHeadersだとチェックボックスが消えてしまう。
今回の問題はコレ。
123
おまけに、ディスプレイサイズ150%の場合。
DataGridViewButtonColumn.FlatStyleプロパティがStandardの場合は、AutoSizeRowsModeプロパティがAllHeaders、DisplayedHeadersだとチェックボックスが消えてしまう。これは100%、125%のときと変わらない。
でも、DataGridViewButtonColumn.FlatStyleプロパティがFlatの場合、今度は100%の時と同様、全て表示できる。
何で125%だけダメなんだ?
150
よく分からないけど、結論は「AutoSizeRowsModeプロパティは、AllHeadersと、DisplayedHeaders以外を使用した方がいい」ということに。
FlatStyleについては、わざわざFlatにする必要はなかった。
DataGridView.AutoSizeRowsMode プロパティに指定する値(DataGridViewAutoSizeRowsMode)の説明は、以下の通り。

メンバ名 説明
None 行の高さは自動的に調節されません。
AllHeaders 行の高さが、行ヘッダーの内容に合わせて調節されます。
AllCellsExceptHeaders 行の高さが、ヘッダー セルを除く行内のすべてのセルの内容に合わせて調節されます。
AllCells 行の高さが、ヘッダー セルを含む行内のすべてのセルの内容に合わせて調節されます。
DisplayedHeaders 行の高さが、現在画面上に表示されている行ヘッダーの内容に合わせて調節されます。
DisplayedCellsExceptHeaders 行の高さが、現在画面上に表示されている、ヘッダー セルを除く行内のすべてのセルの内容に合わせて調節されます。
DisplayedCells 行の高さが、現在画面上に表示されている、ヘッダー セルを含む行内のすべてのセルの内容に合わせて調節されます。

AllHeaders、DisplayedHeadersは、結果的に高さを狭めてしまうため、チェックボックスを使用している場合は不向きのようだ。
Noneなどにすると125%の場合でも表示できるようになった。
AutoSizeRowsMode_None

Leave a comment

メールアドレスが公開されることはありません。

CAPTCHA


*