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

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

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

Re[6]: セル値が0のとき、そのForeColorを白にする


(過去ログ 169 を表示中)

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

■97463 / inTopicNo.1)  セル値が0のとき、そのForeColorを白にする
  
□投稿者/ たかし (16回)-(2021/05/20(Thu) 09:39:56)

分類:[.NET 全般] 

お世話になります、たかしです。
Accessのような条件付書式をVB.NETのDataGridViewで行ないたいのですが分かりません。
ウエブで検索して色々試してみましたがどれも上手くいきません。
ズバリ、セル値が「0」のとき、そのセルのForeColorをホワイトにしたいです。
つまりゼロのときあたかも「空白」のようにしたいのです。
方法がおわかりになる方、よろしくお願いいたします。

引用返信 編集キー/
■97464 / inTopicNo.2)  Re[1]: セル値が0のとき、そのForeColorを白にする
□投稿者/ Hongliang (1174回)-(2021/05/20(Thu) 09:50:45)
CellFormattingイベントで、e.RowIndexやe.ColumnIndexやe.Valueなどを使って前景色を変化させる対象のセルかどうか判定し、対象のセルであればe.CellStyle.ForeColorに設定する、という手順で良いかと思います。
引用返信 編集キー/
■97465 / inTopicNo.3)  Re[2]: セル値が0のとき、そのForeColorを白にする
□投稿者/ たかし (17回)-(2021/05/20(Thu) 11:39:27)
No97464 (Hongliang さん) に返信
> CellFormattingイベントで、e.RowIndexやe.ColumnIndexやe.Valueなどを使って前景色を変化させる対象のセルかどうか判定し、対象のセルであればe.CellStyle.ForeColorに設定する、という手順で良いかと思います。


結論から書いてしまうと、

  If CInt(dgv(4, e.RowIndex).Value) = 0.00 Then
dgv(4, e.RowIndex).Style.ForeColor = Color.White
Else
dgv(4, e.RowIndex).Style.ForeColor = Color.Black
End If

例えば、
0.50までがColor.White
0.51から上がColor.Black
となります。
0.00だけをColor.Whiteに出来ないわけです。

引用返信 編集キー/
■97466 / inTopicNo.4)  Re[3]: セル値が0のとき、そのForeColorを白にする
□投稿者/ Hongliang (1175回)-(2021/05/20(Thu) 11:44:42)
2021/05/20(Thu) 11:57:40 編集(投稿者)

設定先はe.CellStyle.ForeColorを使ったほうが良いです。

0.5とかが設定されたりそうでなかったりはとっちゃんさんのおっしゃる通りかと思います。
引用返信 編集キー/
■97467 / inTopicNo.5)  Re[3]: セル値が0のとき、そのForeColorを白にする
□投稿者/ とっちゃん (725回)-(2021/05/20(Thu) 11:51:34)
No97465 (たかし さん) に返信
> 結論から書いてしまうと、
>
>   If CInt(dgv(4, e.RowIndex).Value) = 0.00 Then
> 例えば、
> 0.50までがColor.White
> 0.51から上がColor.Black
> となります。
> 0.00だけをColor.Whiteに出来ないわけです。
>

CInt() で Value の値を整数化して(0.01や、0.1も0になる状況)で、0.00 と比較しています。
CInt() で整数化してしまうことで、0.00 以外にも整数では0とみなす値が出てくるので
意図しない状況になっているのではないでしょうか?
引用返信 編集キー/
■97468 / inTopicNo.6)  Re[3]: セル値が0のとき、そのForeColorを白にする
□投稿者/ 魔界の仮面弁士 (3099回)-(2021/05/20(Thu) 12:04:33)
No97465 (たかし さん) に返信
> If CInt(dgv(4, e.RowIndex).Value) = 0.00 Then

比較式の左辺が Integer で
比較式の右辺を Double にしているのは何故ですか?
型を一致させましょう。


> dgv(4, e.RowIndex).Style.ForeColor = Color.White

「文字色」「背景色」「選択時の文字色」「選択時の背景色」をセットで扱いましょう。
そうしないと、該当セルがアクティブになった時に 0 の文字が浮かび上がってしまいます。

また、dgv(4, e.RowIndex).Style を使うと、ソート時などに都合が悪いので、
e.CellStyle.ForeColor を使うことをお奨めします。


> 例えば、
> 0.50までがColor.White
> 0.51から上がColor.Black
> となります。

そもそも、何故 CInt しているのですか?

CInt(0.50) は 0 になり
CInt(1.50) は 2 になりますよね。


蛇足ですが、DataGridView を DataSet / DataTable / DataView などに連結させている場合は、
 Dim rowView = TryCast(dgv.Rows(e.RowIndex).DataBoundItem, DataRowView)
 If rowView IsNot Nothing Then
  Dim row As DataRow = rowView.Row
のようにして、バインド元の行にアクセスできます。型付 DataSet の場合も同様に。
引用返信 編集キー/
■97469 / inTopicNo.7)  Re[4]: セル値が0のとき、そのForeColorを白にする
□投稿者/ たかし (18回)-(2021/05/20(Thu) 13:08:28)
皆さん、ありがとうございます。

魔界の仮面弁士様、

If dgv(4, e.RowIndex).Value = 0.00 Then
dgv(4, e.RowIndex).Style.ForeColor = Color.White
Else
dgv(4, e.RowIndex).Style.ForeColor = Color.Black
End If

で解決です。

>そうしないと、該当セルがアクティブになった時に 0 の文字が浮かび上がってしまいます。

これのやり方が分かりません。
どうすればよいのでしょう?

引用返信 編集キー/
■97470 / inTopicNo.8)  Re[5]: セル値が0のとき、そのForeColorを白にする
□投稿者/ 魔界の仮面弁士 (3100回)-(2021/05/20(Thu) 13:23:13)
No97469 (たかし さん) に返信
>>> dgv(4, e.RowIndex).Style.ForeColor = Color.White
>> 「文字色」「背景色」「選択時の文字色」「選択時の背景色」をセットで扱いましょう。
>> そうしないと、該当セルがアクティブになった時に 0 の文字が浮かび上がってしまいます。
> これのやり方が分かりません。
> どうすればよいのでしょう?

ForeColor [文字色] だけではなく
BackColor [背景色] や、[選択色]である
SelectionForeColor / SelectionBackColor も
同時に設定しておく、ということです。

つまり、非選択時と選択時それぞれに対して、
 Dim style = e.CellStyle
 style.ForeColor = style.BackColor
 style.SelectionForeColor = style.SelectionBackColor
のようにして、文字の色を背景と同じ色にしておきます。

この場合、編集時にも文字が見えなくなってしまうので、
該当セルは読み取り専用に設定しておいた方が良いでしょう。


もしも編集可能にしておき、普段は 0 の文字を見せず、編集時だけ可視状態にするなら
 If Not DataGridView1(e.ColumnIndex, e.RowIndex).IsInEditMode Then
  ここで文字色を変更
 End If
のように、非編集時のみ不可視にさせるという対処もできます。
引用返信 編集キー/
■97471 / inTopicNo.9)  Re[6]: セル値が0のとき、そのForeColorを白にする
□投稿者/ たかし (19回)-(2021/05/20(Thu) 14:06:35)

> ForeColor [文字色] だけではなく
> BackColor [背景色] や、[選択色]である
> SelectionForeColor / SelectionBackColor も
> 同時に設定しておく、ということです

なるほど。
しかし空欄にゼロが入っているということが分かるほうがいいので、
このままにしようと思います。
色々と勉強になりました。
ありがとうございます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -