C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: セルの色変更について


(過去ログ 110 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■65537 / inTopicNo.1)  セルの色変更について
  
□投稿者/ にゃん (1回)-(2013/03/06(Wed) 11:45:29)

分類:[C#] 

FlexGridでセルの色変更を正常に行うにはどうすればよいのでしょうか?

visualstudio2010 で flexGrid を使用しています。

セルの1列目の色を変更したいので以下のようにしたところ、
選択セル、選択行や、固定行などの色が 下記で指定した
e.Style.BackColor になってしまいました。

private void c1FlexGrid1_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
{
 if ( e.Col == 1 ) {
  e.Style.ForeColor = Color.Red;
  e.Style.BackColor = Color.FromArgb(255 - e.Row, 255 - e.Row, 255 - e.Row);
 }
}

そこで、次のようにしたのですが、
この方法が正しいのかわかりませんが

CellStyle select, nosel;

private void Form1_Load(object sender, EventArgs e)
{
 select = fGrid.Styles.Add("SELECT");
 select.ForeColor = Color.Blue;
 select.BackColor = Color.FromArgb(192, 192, 255);
 nosel = fGrid.Styles.Add("NOSEL");
 nosel.ForeColor = SystemColors.WindowText;
 nosel.BackColor = SystemColors.Window;
}

private void c1FlexGrid1_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e)
{
 if ( e.Col == 1 ) {
  e.Style.ForeColor = Color.Red;
  e.Style.BackColor = Color.FromArgb(255 - e.Row, 255 - e.Row, 255 - e.Row);
 } else {
  if ( fGrid.Row == e.Row ) e.Style = fGrid.Styles["SELECT"];
  else           e.Style = fGrid.Styles["NOSEL"];
 }
}

上記対応である程度表示できるようになったのですが、
下記セルの場合、8などを選択すると1・2・6が[NOSEL]状態で表示されます
これはどうすればよいのでしょうか?また、上記以外にほかによい方法がありますか?

┌─┬─┬─┬─┐
│ │ │ │ 8│
│ │ 3│ ├─┤
│ │ │ │ 9│
│ 1├─┤ ├─┤
│ │ │ │10│
│ │ 4│ ├─┤
│ │ │ │11│
├─┼─┤ 7├─┤
│ │ │ │12│
│ │ 5│ ├─┤
│ │ │ │13│
│ 2├─┤ ├─┤
│ │ │ │14│
│ │ 6│ ├─┤
│ │ │ │15│
└─┴─┴─┴─┘

引用返信 編集キー/
■65539 / inTopicNo.2)  Re[1]: セルの色変更について
□投稿者/ howling (222回)-(2013/03/06(Wed) 12:17:34)
2013/03/06(Wed) 12:25:37 編集(投稿者)

No65537 (にゃん さん) に返信
こんにちわ。
FlexGridとか初めて聞きました。メジャーな物なんですかね?
使い勝手はいいのかな…?
(結構当たり前のように書かれているので、そんなコントロール、C#にデフォルトであったっけ?と調べてからポカーンとしてましたが…)

さて、セルの色変更を「正常に」行うという事でしたが、
できれば、例の8を選択した場合で構いませんので、
にゃんさんの言う「正常に行われるセルの色変更」という物を教えて欲しいです。
「普通に」とか、「よくある」とか、ついつい言いがちですけど、それは伝わらないので!!
(これは特に企画側に言いたいですけどね…)

私の感覚では、例の8を選択した時だと、
1・3・8のみSELELT状態、他は「NOSEL」状態になるはずなのかな?と。
(「NOSEL」ってNO SELECT(非選択状態)の勝手な略として考えてますが…。)

いかがでしょうか?

また、もし私の感覚通りの挙動を示すべきなら、
c1FlexGrid1_OwnerDrawCell内のif文のところに全てかかっていると思いますので、
そこがおかしいんじゃないのかなと…。
fGrid.Rowって、fGridの行の総数であって、選択されてる行の事じゃないんじゃね?と思ってるんですが、
そもそものFlexGridを知らないので、さぁ?というところですね。

引用返信 編集キー/
■65540 / inTopicNo.3)  Re[2]: セルの色変更について
□投稿者/ にゃん (2回)-(2013/03/06(Wed) 12:44:29)
えっと、
通常だと、選択された状態ではflexgridのスタイルの標準で"Hilight"が表示され、
選択されていない場合は"Normal"で表示されるのですが、


8を選択すると、Hilight=1,3,7,8 の状態になります[正常]
9を選択すると、Hilight=9, Normal=1,3,7の状態になります[異常]
10を選択すると、Hilight=4,10, Normal=1,7の状態になります[異常]
11を選択すると、Hilight=11, Normal=1,3,7の状態になります[異常]
12を選択すると、Hilight=1,3,7,11の状態になります[正常]
と、いうことです。

で、結局
c1FlexGrid1_OwnerDrawCell でどのようにかけばいいのかな?
と、いうことです。



引用返信 編集キー/
■65541 / inTopicNo.4)  Re[3]: セルの色変更について
□投稿者/ howling (223回)-(2013/03/06(Wed) 13:01:26)
No65540 (にゃん さん) に返信
おっと、7なんてあったんですね。気づいてなかった。すみません。

で、じゃあ次の質問なんですが

選択中のRow及び選択中のColumn、あるいは選択中のCellの取得ってどうやるんでしょうか?
先のところにも書きましたが、
オーナードローのところに、「選択中のセルに関すること」が何も書かれていないからでは?
と思ってますが、いかがでしょう?
引用返信 編集キー/
■65543 / inTopicNo.5)  Re[4]: セルの色変更について
□投稿者/ にゃん (4回)-(2013/03/06(Wed) 13:24:43)
c1FlexGrid1_OwnerDrawCell
では

表示されているセルの分だけイベントが発生しますよね。
この場合ですべて表示されているとすれば
通常では(0,0)〜(7,3)で24回呼び出されるわけですが
呼び出された時に引数として e.Row, e.Col の値が入っています。

選択されている行は fGrid.Row ですから
fGrid.Row == e.Row で選択されているかどうかわかります。

ただ、マージされている場合はどうやら
(0,0)〜(7,3)の24回ではなくて
以下の分は呼び出されていないようです。
(1,0),(2,0),(3,0) 1に該当
(5,0),(6,0),(7,0) 2に該当
(1,1)3に該当
(3,1)4に該当
(5,1)5に該当
(7,1)6に該当
(1,2),(2,2),(3,2),(4,2),(5,2),(6,2),(7,2)7に該当

引用返信 編集キー/
■65547 / inTopicNo.6)  Re[3]: セルの色変更について
□投稿者/ howling (224回)-(2013/03/06(Wed) 17:37:47)
No65540 (にゃん さん) に返信
ふむふむ。
私もドキュメント見に行っちゃいました。
おっしゃる通りのようです。
とすると、「e.Rowとe.Colが示す場所」というのが結合されてる部分を含んでいる場合だけ、
何かしらおかしな値が入っていそうな気がします。
さて、そこで値のチェックをお願い&こちらも知りたいのですが、

> 8を選択すると、Hilight=1,3,7,8 の状態になります[正常]
> 9を選択すると、Hilight=9, Normal=1,3,7の状態になります[異常]
> 10を選択すると、Hilight=4,10, Normal=1,7の状態になります[異常]
> 11を選択すると、Hilight=11, Normal=1,3,7の状態になります[異常]
> 12を選択すると、Hilight=1,3,7,11の状態になります[正常]
> と、いうことです。

こちらは例で提示されている場合において、実際に表示された状態を書かれていますか?
その場合、「下記セルの場合、8などを選択すると1・2・6が[NOSEL]状態で表示されます」と最初の話でありますから、
HilightとSELECT,NormalとNOSELは別のことを示していますか…?
OwnerPaintでやった場合は、ブレークポイント捕まらないんですっけ?見れれば一発なんですが…。
引用返信 編集キー/
■65548 / inTopicNo.7)  Re[4]: セルの色変更について
□投稿者/ howling (225回)-(2013/03/06(Wed) 17:52:09)
自己レスです。

質問文にある、「下記セルの場合、8などを選択すると1・2・6が[NOSEL]状態で表示されます」というのが嘘だとして、

>>8を選択すると、Hilight=1,3,7,8 の状態になります[正常]
>>9を選択すると、Hilight=9, Normal=1,3,7の状態になります[異常]
>>10を選択すると、Hilight=4,10, Normal=1,7の状態になります[異常]
>>11を選択すると、Hilight=11, Normal=1,3,7の状態になります[異常]
>>12を選択すると、Hilight=1,3,7,11の状態になります[正常]

これは正しい挙動だ。

おっしゃる通り、c1FlexGrid1_OwnerDrawCellに来るのは全てのセルではなく、
結合されている場合はそのセルの左上の値が入る。

すると、8を選択した場合はe.Row = 0, e.Col = 3となるので、
正常に動作する。
次に、9を選択した場合はe.Row = 1, e.Col = 3となるんだけれども、
1のセルはRow = 0, Col = 0を示しているため、Rowも異なってしまいNormal表示となる。
同様に、3のセルはRow = 0, Col = 1、7のセルはRow = 0, Col = 2となるため、Normal表示となる。

つまり、「セルがどことどこが結合しているのか」というのを取得できないと、このイベント内で処理できない。
セルが結合している列数(これは不要か。列の結合は無いらしいから)と、結合している行数は無いですかね?
あれば、e.Row == fGrid.Row とやっているところをe.Row <= fGrid.Row <= (e.Row + 結合数)としてやれば、
それでうまくいくはず。
引用返信 編集キー/
■65549 / inTopicNo.8)  Re[5]: セルの色変更について
□投稿者/ howling (226回)-(2013/03/06(Wed) 17:55:30)
2013/03/06(Wed) 17:58:11 編集(投稿者)

あと、

>>12を選択すると、Hilight=1,3,7,11の状態になります[正常]

上記の考えが正しいなら、これは嘘。そもそもHilight=1,3,7,11は正しくないはず。
Hilight=2,5,12となって、異常なんじゃないかな。

引用返信 編集キー/
■65551 / inTopicNo.9)  Re[3]: セルの色変更について
□投稿者/ shu (214回)-(2013/03/07(Thu) 08:34:58)
No65540 (にゃん さん) に返信

> 8を選択すると、Hilight=1,3,7,8 の状態になります[正常]
> 9を選択すると、Hilight=9, Normal=1,3,7の状態になります[異常]
> 10を選択すると、Hilight=4,10, Normal=1,7の状態になります[異常]
> 11を選択すると、Hilight=11, Normal=1,3,7の状態になります[異常]
> 12を選択すると、Hilight=1,3,7,11の状態になります[正常]
> と、いうことです。
これがOwnerDraw時の状態ということなのでしょうか?
では正常な状態というのはどういう状態なのかとういうことになります。

マージセルについて左上のセルに対してのみイベントが発生しているということなので
そのセルについてマージセルに対する判定処理を行えばよいのではないのでしょうか?
引用返信 編集キー/
■65552 / inTopicNo.10)  Re[5]: セルの色変更について
□投稿者/ shu (215回)-(2013/03/07(Thu) 08:38:29)
No65543 (にゃん さん) に返信
> 選択されている行は fGrid.Row ですから
> fGrid.Row == e.Row で選択されているかどうかわかります。
この判定から9の選択において1,3,7は該当しないことになりますが、
これをマージセル内の行すべてに対し判定しなければならないということになりそうな
気がします。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -