- PR -

'datagridviewのマイナス値の書式設定

投稿者投稿内容
だんく
常連さん
会議室デビュー日: 2006/02/06
投稿数: 47
投稿日時: 2006-02-06 21:12
datagridviewのマイナス値の書式設定でマイナスは赤い色で表示しているのですが、
列を2つ以上指定したい場合はどのようにすれば、良いでしょうか?
よろしくお願い致します。

Private Sub datagridview1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles datagridview1.CellFormatting
If datagridview1.Columns(e.ColumnIndex).Name.Equals("列名") Then
If CInt(e.Value) < 0 Then
e.CellStyle.ForeColor = Color.Red
End If
End If
End Sub
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-07 02:14
.NET Framework 2.0 ですね。

引用:

だんくさんの書き込み (2006-02-06 21:12) より:

If datagridview1.Columns(e.ColumnIndex).Name.Equals("列名") Then


列名で判断するのは望ましくないかな。
ColumnIndex 決め打ちで、列挙体を使用した方が良いかもしれません。

引用:

If CInt(e.Value) < 0 Then


0 未満であることの評価なので、キャストする必要はないですね。

引用:

e.CellStyle.ForeColor = Color.Red


本題の質問の回答ですが、これはカレントな列のみですよね。

そんなわけで、Me.DataGridView1([行], [列]).Style.ForeColor = Color.Red
などとすれば、他の行や列の Style も変更可能です。

ただ、他の列まで変更する場面が想像できませんが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんく
常連さん
会議室デビュー日: 2006/02/06
投稿数: 47
投稿日時: 2006-02-08 18:40
お返事ありがとうございます。
>本題の質問の回答ですが、これはカレントな列のみですよね。

すいません。カレントという意味がわかりません。調べましたら「現在作業中の〜」
という意味らしいのですが、解釈が難しそうなので、
状況としましては、フォームにdatagridviewが6個程度あります。
それぞれのdatagridviewに−(マイナス)もある、列が複数あります。
で、それぞれに赤い色で表示させたいです。

>そんなわけで、Me.DataGridView1([行], [列]).Style.ForeColor = Color.Red
>などとすれば、他の行や列の Style も変更可能です。

自分なりに考えて作ってみたんですが、処理に時間がかかるのか大変遅いです。
どこが、いけないのでしょうか?
又、datagridviewの場合([列],[行])の順番になるようです。
以下コードです。
Private Sub datagridview1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles datagridview1.CellFormatting
Dim a As Integer
For a = 0 To datagridview1.Rows.Count - 1 Step 1
If datagridview1(4, a).Value < 0 Then
Me.datagridview1(4, a).Style.ForeColor = Color.Red
End If
Next
End Sub

>ただ、他の列まで変更する場面が想像できませんが...

例えば、列で 粗利・利益率などがあるとその列の中で、赤字があれば
色を赤に変えたいです。


わかりにくい部分が多数あると思いますが、よろしくお願い致します。
だんく
常連さん
会議室デビュー日: 2006/02/06
投稿数: 47
投稿日時: 2006-02-08 18:52
書きそびれました、すいません。
一番初め投稿(投稿日時: 2006-02-06 21:12)のコードは↓の所からそのまま引用しました。
目印としては
' Changes how cells are displayed depending on their columns and values.
とコメントされているところですのです。
http://msdn2.microsoft.com/ja-jp/library/z1cc356h.aspx
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-09 01:25
引用:

だんくさんの書き込み (2006-02-08 18:40) より:

すいません。カレントという意味がわかりません。調べましたら「現在作業中の〜」
という意味らしいのですが、解釈が難しそうなので、


列は間違いで、現在のイベントを引き起こす元となった Cell ですね。

引用:

又、datagridviewの場合([列],[行])の順番になるようです。


投稿後に別のサイトで知りました。わかりにくい... orz

引用:

自分なりに考えて作ってみたんですが、処理に時間がかかるのか大変遅いです。
どこが、いけないのでしょうか?


まず、数にもよるでしょう。

datagridview1(4, a) が重複している部分があるので、
一度 Cell として別の変数に入れて... もあまり変わらないだろうなぁ... (^-^;)

やっぱり単純に数の問題だと思うんですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
だんく
常連さん
会議室デビュー日: 2006/02/06
投稿数: 47
投稿日時: 2006-02-09 02:42
初めのコード Aとします
Private Sub datagridview1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles datagridview1.CellFormatting
If datagridview1.Columns(e.ColumnIndex).Name.Equals("列名") Then
If CInt(e.Value) < 0 Then
e.CellStyle.ForeColor = Color.Red
End If
End If
End Sub

自分が考えたコード Bとします。
Private Sub datagridview1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles datagridview1.CellFormatting
Dim a As Integer
For a = 0 To datagridview1.Rows.Count - 1 Step 1
If datagridview1(4, a).Value < 0 Then
Me.datagridview1(4, a).Style.ForeColor = Color.Red
End If
Next
End Sub

この2つのコードでは、動作は全く同じ(1個の列の書式設定)なのですが、
コードBは大変遅く(表示までの時間・スクロール時の滑らかさ)、
不便なものです。(フィルタを設定し件数を減らせば速くなります)

コードAは滑らかで、動作も軽快ですので、Aの方でいきたいんですが、
ヘルプから引用したので改良の仕方がわかりません。
このコードAに2つ以上の列を設定する事はできますでしょうか?
できる場合、コードを教えていただけると大変ありがたいです。
よろしくお願い致します。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-02-09 03:00
ん〜……。
前提が把握しきれない。
結局のところ、以下の表があったとして、どのセルの色を変えたいのでしょうか?
コード:
dataGridView1
       columnA   columnB
rowA        -3       100
rowB         3      -100

dataGridView2
       columnA'  columnB'
rowA'        3      -100
rowB'       -3       100

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-09 09:39
引用:

だんくさんの書き込み (2006-02-09 02:42) より:

この2つのコードでは、動作は全く同じ(1個の列の書式設定)なのですが、
コードBは大変遅く(表示までの時間・スクロール時の滑らかさ)、
不便なものです。(フィルタを設定し件数を減らせば速くなります)


SuspendLayout メソッドと ResumeLayout メソッドで挟んでも無駄な足掻きかなぁ。
後は先にも書いたように datagridview1(4, a) の時点で Cell として変数に格納する。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)