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

データーグリッドビューのTopLeftHeaderCellのサイズの変更の仕方

環境/言語:[VS2008 C# Framework3.5]
分類:[.NET]

お世話になります。

データーグリッドビューの左上のヘッダーセルのサイズを変更したり表示を消したいと思っています。

f.dataGridView1.TopLeftHeaderCell.Size.Width
f.dataGridView1.TopLeftHeaderCell.Visible

プロパティを参照するまではわかりましたが、プロパティが読み取り専用らしく変更ができませんでした。

どなたかわかる方いらっしゃいますか?
よろしくお願いします。
幅は行ヘッダ共通の DataGridView.RowHeadersWidth で表現されますが……。
TopLeftHeaderCell だけの幅を変更したり非表示にしたりすることでどんな表示結果を望まれているのでしょうか?
■No26434に返信(Hongliangさんの記事)
> 幅は行ヘッダ共通の DataGridView.RowHeadersWidth で表現されますが……。
> TopLeftHeaderCell だけの幅を変更したり非表示にしたりすることでどんな表示結果を望まれているのでしょうか?

狭い箇所にDataGridViewを置きたいため、なるべくセルをつめて表示したいと
考えています。TopLeftHeaderCell は狭めるか表示を消して他のセルの幅を取りたい
と思っています。
DataGridView は表形式で表示するので、行の高さはその行一行、列の幅はその列一列すべて同じになりますよね?
TopLeftHeaderCell は列で見た場合ほかの行ヘッダと同じ列ですから、ほかの行ヘッダと同じ幅になりますよね?
TopLeftHeaderCell の右に並んでる列ヘッダのセルが左にはみ出してくるようなのをお望みなのですか? 列ヘッダに見えなくなっちゃいそうですが。
■No26436に返信(Hongliangさんの記事)
> DataGridView は表形式で表示するので、行の高さはその行一行、列の幅はその列一列すべて同じになりますよね?
> TopLeftHeaderCell は列で見た場合ほかの行ヘッダと同じ列ですから、ほかの行ヘッダと同じ幅になりますよね?
> TopLeftHeaderCell の右に並んでる列ヘッダのセルが左にはみ出してくるようなのをお望みなのですか? 列ヘッダに見えなくなっちゃいそうですが。

TopLeftHeaderCell のみ幅を狭め、その分右に並んでいるヘッダの幅を増やしたいと
考えています。TopLeftHeaderCellのみは列ヘッダ・行が見えなくなっても問題ないですね。
2010/02/20(Sat) 16:56:16 編集(投稿者)

> TopLeftHeaderCell は狭めるか表示を消して他のセルの幅を取りたい
TopLeftHeaderCell とは、下図の【左上】と書かれた固定セルを表します。

┏━━┳━━┯━━┯━━┯━━┯━━┓
┃左上┃列0│列1│列2│列3│列4┃
┣━━╋━━┿━━┿━━┿━━┿━━┫
┃行0┃0, 0│1, 0│2, 0│3, 0│4, 0┃
┠──╂──┼──┼──┼──┼──┨
┃行1┃0, 1│1, 1│2, 1│3, 1│4, 1┃
┠──╂──┼──┼──┼──┼──┨
┃行2┃0, 2│1, 2│2, 2│2, 2│4, 2┃
┗━━┻━━┷━━┷━━┷━━┷━━┛



その幅を狭めるという事は、他の行ヘッダもまとめて狭まるという事を
意味しますが、それで構わないのでしょうか?

 ┏━┳━━┯━━┯━━┯━━┯━━┓
 ┃LT┃列0│列1│列2│列3│列4┃
 ┣━╋━━┿━━┿━━┿━━┿━━┫
 ┃0┃0, 0│1, 0│2, 0│3, 0│4, 0┃
 ┠─╂──┼──┼──┼──┼──┨
 ┃1┃0, 1│1, 1│2, 1│3, 1│4, 1┃
 ┠─╂──┼──┼──┼──┼──┨
 ┃2┃0, 2│1, 2│2, 2│2, 2│4, 2┃
 ┗━┻━━┷━━┷━━┷━━┷━━┛

それで良いのであれば、TopLeftHeaderCell を操作するのではなく、
RowHeaderWidth プロパティを変更すれば OK です(最小値は 4 です)。


一方、「表示を消したい」という話についてですが、これについては

   <RowHeaderVisible    = False>
   <ColumnHeaderVisible = True >
   ┏━━┯━━┯━━┯━━┯━━┓
   ┃列0│列1│列2│列3│列4┃
   ┣━━┿━━┿━━┿━━┿━━┫
   ┃0, 0│1, 0│2, 0│3, 0│4, 0┃
   ┠──┼──┼──┼──┼──┨
   ┃0, 1│1, 1│2, 1│3, 1│4, 1┃
   ┠──┼──┼──┼──┼──┨
   ┃0, 2│1, 2│2, 2│2, 2│4, 2┃
   ┗━━┷━━┷━━┷━━┷━━┛

   <RowHeaderVisible    = True >
   <ColumnHeaderVisible = False>
┏━━┳━━┯━━┯━━┯━━┯━━┓
┃行0┃0, 0│1, 0│2, 0│3, 0│4, 0┃
┠──╂──┼──┼──┼──┼──┨
┃行1┃0, 1│1, 1│2, 1│3, 1│4, 1┃
┠──╂──┼──┼──┼──┼──┨
┃行2┃0, 2│1, 2│2, 2│2, 2│4, 2┃
┗━━┻━━┷━━┷━━┷━━┷━━┛

   <RowHeaderVisible    = False>
   <ColumnHeaderVisible = False>
   ┏━━┯━━┯━━┯━━┯━━┓
   ┃0, 0│1, 0│2, 0│3, 0│4, 0┃
   ┠──┼──┼──┼──┼──┨
   ┃0, 1│1, 1│2, 1│3, 1│4, 1┃
   ┠──┼──┼──┼──┼──┨
   ┃0, 2│1, 2│2, 2│2, 2│4, 2┃
   ┗━━┷━━┷━━┷━━┷━━┛

のいずれかの選択肢となります。
それとも、TopLeftHeaderCell だけを消すということで、
以下のような形で表示することを望んでいるのでしょうか?

   ┏━━┯━━┯━━┯━━┯━━┓
   ┃列0│列1│列2│列3│列4┃
┏━━╋━━┿━━┿━━┿━━┿━━┫
┃行0┃0, 0│1, 0│2, 0│3, 0│4, 0┃
┠──╂──┼──┼──┼──┼──┨
┃行1┃0, 1│1, 1│2, 1│3, 1│4, 1┃
┠──╂──┼──┼──┼──┼──┨
┃行2┃0, 2│1, 2│2, 2│2, 2│4, 2┃
┗━━┻━━┷━━┷━━┷━━┷━━┛

だとしたら、左上セルの上に Panel 等の別のコントロールを重ねて配置すれば、
見た目上は代用できるかも知れません。

そうではなく、本当に左上をくり貫きたいなら、
http://dobon.net/vb/dotnet/form/formregion.html
の方法で、左上を切り取った Region を用意すれば OK です。

Region を使う場合は、ヘッダの幅/高さを固定にしておいた方が楽だと思いますが、
もしも、可変にしておきたいのであれば、RowHeadersWidthChanged/ColumnHeadersHeight の
イベントを使って、Region を再作成するようにすれば実現できるかと。
■No26438に返信(魔界の仮面弁士さんの記事)
> 2010/02/20(Sat) 16:56:16 編集(投稿者)
>
>>TopLeftHeaderCell は狭めるか表示を消して他のセルの幅を取りたい
> TopLeftHeaderCell とは、下図の【左上】と書かれた固定セルを表します。
>
> ┏━━┳━━┯━━┯━━┯━━┯━━┓
> ┃左上┃列0│列1│列2│列3│列4┃
> ┣━━╋━━┿━━┿━━┿━━┿━━┫
> ┃行0┃0, 0│1, 0│2, 0│3, 0│4, 0┃
> ┠──╂──┼──┼──┼──┼──┨
> ┃行1┃0, 1│1, 1│2, 1│3, 1│4, 1┃
> ┠──╂──┼──┼──┼──┼──┨
> ┃行2┃0, 2│1, 2│2, 2│2, 2│4, 2┃
> ┗━━┻━━┷━━┷━━┷━━┷━━┛
> 一方、「表示を消したい」という話についてですが、これについては
>
>    <RowHeaderVisible = False>
>    <ColumnHeaderVisible = True >
>    ┏━━┯━━┯━━┯━━┯━━┓
>    ┃列0│列1│列2│列3│列4┃
>    ┣━━┿━━┿━━┿━━┿━━┫
>    ┃0, 0│1, 0│2, 0│3, 0│4, 0┃
>    ┠──┼──┼──┼──┼──┨
>    ┃0, 1│1, 1│2, 1│3, 1│4, 1┃
>    ┠──┼──┼──┼──┼──┨
>    ┃0, 2│1, 2│2, 2│2, 2│4, 2┃
>    ┗━━┷━━┷━━┷━━┷━━┛
>

申し訳ありません。どうやら自分は勘違いしていました。TopLeftHeaderCell というのは左上の一マスだけだったんですね。その下にあるヘッダー行も含まれているとばっかり思っていました。

自分が実現したかったことは三角アイコンのあるヘッダー行を消せればよかったのでDataGridViewのプロパティのRowHeaderVisibleをFalseにすることでヘッダー行が消すことができ達成できました。

仮面弁士さん! 詳しい図表まで書いていただきありがとうございます!
TopLeftHeaderCellについて勘違いしていた事をこの図を見てすぐに気がつきました。ありがとうございます!
ColumnHeaderVisible をFalseにするとカラムヘッダーが非表示になるんですね。
今後の参考になります。
コントロール下に重ねてTopLeftHeaderCellを消すというやり方は熟練者ならではの技ですね。自分にはとても気がつかないです。><

Hongliangさんも質問に答えてくださりありがとうございます!

TopLeftHeaderCellについて理解が足りなかったようです。
RowHeaderVisibleをfalseにすることで実現したいことが実現できました!

Hongliangさん、魔界の仮面弁士 どうもありがとうございました!
解決済み!
■No26439に返信(たなかさんの記事)
細かい話で恐縮ですが、用語の話で少し気になったので。

> 自分が実現したかったことは三角アイコンのあるヘッダー行を消せればよかったので
左端の部分を『ヘッダー行』と表現するのは違和感があります。

上記の表現ですと、列名を表示する方のヘッダーと誤解されるかも知れません。
(列見出しにもソート順を示す三角アイコンがありますので)

今回は、話の流れや引用されていた
>   <RowHeaderVisible    = False>
>   <ColumnHeaderVisible = True >
などから、それが左端のヘッダーを指していることは分かりますが、個人的には、

 行ヘッダー → それぞれの行のヘッダー部     → 左端の三角アイコンのセル
 ヘッダー行 → ヘッダーとして機能している行 → 列見出し(最上部の固定行)

と連想される事が多いであろうかと思っています。

No26434 > 幅は行ヘッダ共通の
No26438 > 他の行ヘッダもまとめて狭まるという事を
No26439 > 三角アイコンのあるヘッダー行を消せればよかったので



気になったので、Microsoft のサイトで『ヘッダー行』という用語を探してみたところ、
図解付きの解説例としてこのような物が見つかりました。
http://office.microsoft.com/training/training.aspx?AssetID=RP011597311041&CTT=6&Origin=RP011597101041

冒頭にて、下記形式の(1)の行を『ヘッダー行』と呼んでいます。やはり列の見出しですね。

   経費明細
┏━━┯━━━━━┯━━━┓
┃日付│ 内 容 │ 金額┃(1)ヘッダー行
┣━━┿━━━━━┿━━━┫
┃6/10│図書購入費│ 4,800┃
┃6/11│運送費  │ 1,500┃(2)データ行
┃6/20│備品消耗費│ 8,000┃
┠──┼─────┼───┨
┃    │  合計:│14,300┃(3)フッター行
┗━━┷━━━━━┷━━━┛
また、同ページの最後の方には、
 「通常、ヘッダー行は、列の見出しとして使用されます。」
という表記もありました。



その反対に、『行ヘッダー』という用語の利用方法についてみてみると
http://office.microsoft.com/ja-jp/access/HA100308111041.aspx
》[アクション行を移動するには]
》アクションの左にある行ヘッダーをクリックしてアクション行を選択し、
》新しい位置にドラッグします。 
行選択時に使われる“左にある”ヘッダー部を指す言葉として使われています。

また、DataGridView そのものに対する解説を見ても、
http://msdn.microsoft.com/ja-jp/library/8x6w9028.aspx
『列ヘッダーをクリックすると、その列全体が選択されます。』
『行ヘッダーをクリックすると、その行全体が選択されます。』
の表現があり、やはり『行ヘッダー』とは左端のヘッダ部を指す言葉であるようです。



もっとも、このあたりは Microsoft 内部でも混乱が見られるようで、
http://office.microsoft.com/ja-jp/infopath/HA101154661041.aspx
などでは、『通常、行ヘッダーは列見出しとして使用されます。』という
上記とは逆の解説も見受けられるのですけれどね。(フィードバックしておこう…)


それと:

> 仮面弁士さん! 詳しい図表まで書いていただきありがとうございます!
こっちでは名前が省略されていて、

> Hongliangさん、魔界の仮面弁士 どうもありがとうございました!
こっちでは省略されていない点もアンバランスで気になっていたり。(^^;
解決済み!

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