| 2008/12/01(Mon) 19:49:21 編集(投稿者)
# 長文失礼。
■No28814 (見習いPG さん) に返信 > DataGridViewCellStyleクラスでは、"行"や"列"また"セル"に 他にも、"奇数行" などの設定もありますね。また、ヘッダ部/データ部のセルの違いもあります。
> 設定される値は独立していて、 独立しているというか、透過関係にあります。 HTML でいうところのスタイルシートの関係に近いかな。
文章で説明しにくいので…他の物に喩えさせてください。
新規プロジェクトを作成し、Form1 の上に GroupBox を 1 つ貼ってみてください。 そしてその上に、Panel を 2 つ貼ります。
階層関係としては、このような配置となります。
Form1 └groupBox1 ├panel1 └panel2
# 以下の説明は、文章で読むと分かりにくいと思うので、 # できれば、実際に開発環境で操作しながら読んでみてください。(^^;
さて、Form1 の BackColor は、既定で "Control" です。 そのため、各コントロールの背景色も、"Control" になっており、 かつ、それらのプロパティは『細字』で表現されています。
ここで、groupBox1 の BackColor を "Yellow" に変更してみてください。 groupBox1 の BackColor プロパティが『太字』で表現されますね。
この時、2 枚の Panel の BackColor もまた、"Yellow" になっています。 しかし、BackColor そのものは『細字』のままであるはずです。
そしてここで、panel2 の方の BackColor に、別の色(例えば "Red")を設定します。 panel2 の BackColor が『太字』に変わるので、再度 "Yellow" を選択しなおします。
このようにすると、それぞれの Panel の BackColor は、 panel1 … 『細字』の "Yellow" panel2 … 『太字』の "Yellow" となります。どちらも同じ色ですが、一方は「太字」で表記されていますね。
そしてここで、groupBox1 の BackColor を "Blue" にするとどうなるでしょう。 panel1 … 『細字』の "Blue" panel2 … 『太字』の "Yellow" になるはずです。 panel1 は親の値を引き継ぎますが、panel2 は "Yellow" のままです。
そしてさらに、groupBox1 の BackColor を右クリックして、[リセット]を選択します。 すると panel1 が、親の親であるフォームの設定色に戻り、 panel1 … 『細字』の "Control" panel2 … 『太字』の "Yellow" という結果に変わります。
------------------------------------------------------
これと同じことが、DataGridView のスタイル設定にも言えます。
Style プロパティに null をセットすると、セルのスタイルはクリアされ、 HasStyle = false の状態になります。この場合、そのセルのスタイルは 上位要素(行やグリッド本体など)の設定が使って処理される事になります。
また、セルに個別のスタイルが割り当てられていた場合であっても、 .Alignment = DataGridViewContentAlignment.NotSet .Font = null .BackColor = Color.Empty などが割り当てられていれば、フォントや背景色など、個々のメンバだけが 上位要素の書式を引き継ぐ事になります。
そして、その引き継いだ値を得るのが、先のサンプルでも利用した InheritedStyle プロパティ(読取専用)となります。
> 対象の"セル・行・列"の状態を保ったまま変更したいのであれば、 この場合、この「変更」という行為が、それぞれのスタイルに対して 「設定のリセット」なのか「新しい設定の割り当て」なのかを見直し、 かつ、それがセル/行/奇数行/列/グリッド全体など、どの要素に対して 行おうとしているのかを意識するようにしてみてください。
それらを意識した上で、元々の質問 No28699 の > セル単位での初期の状態を設定したいのですが を考えてみると、修正すべき箇所が見えてくるかと思いますよ。
> MS公式を見てみましたが、あまり理解できず 見落とされがちな点があるので、もう少し書かせてください:
セルのスタイルが未設定(null)の時に、Style プロパティを参照すると、 その場で新たなスタイルが割り当てられてしまう点に気をつけてください。
Console.WriteLine(dataGridView1[1, 1].HasStyle); // この時点で false だとしても、 Console.WriteLine(dataGridView1[1, 1].Style) ; // ここで Style を取得してしまうと Console.WriteLine(dataGridView1[1, 1].HasStyle); // この時点で true に変化してしまう。
スタイル設定の増加はパフォーマンスに影響を与えますので、セル数が多い場合は注意してください。 たとえば、先の No28705 にも >> 現在の設定値を確認する目的であれば、いきなり .Style.Font を参照するのは NG です。 と書いたように if ( dataGridView1[col, row].Style.Font == null ) のような判定は、できる限り避けるようにする必要があります。設定値の確認には、 InheritedStyle プロパティや HasStyle プロパティを使うようにしましょう。
また、各セルに対するスタイル設定を共有することも検討してみてください。 たとえば、こんな感じで…。
DataGridViewCellStyle blackStyle = new DataGridViewCellStyle(); DataGridViewCellStyle greenStyle = new DataGridViewCellStyle(); private void Form1_Load(object sender, EventArgs e) { blackStyle.BackColor = blackStyle.SelectionBackColor = Color.Black; greenStyle.BackColor = greenStyle.SelectionBackColor = Color.Green;
dataGridView1.AllowUserToAddRows = false; dataGridView1.RowCount = 4; dataGridView1.ColumnCount = 4;
dataGridView1[1, 1].Style = dataGridView1[2, 2].Style = blackStyle; dataGridView1[2, 1].Style = dataGridView1[1, 2].Style = greenStyle; }
private void button1_Click(object sender, EventArgs e) { greenStyle.BackColor = Color.YellowGreen; dataGridView1.Invalidate(); } |