現在C#でwindowsアプリケーションを作成しており、その中でデータグリッドの行の色を条件ごとに変化させるということをやろうとしています。

dobon.net(http://dobon.net/vb/dotnet/datagrid/coloredcell.html)さんのソースを参考にし、paintメソッドをオーバーライドすることでセル単位での色を変えることはできたのですが行単位での色の変更方法がまったくわかりません。どなたかご教授下さい。よろしくお願いします。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2006/08/08 14:06:52
  • 終了:2006/08/15 14:10:02

回答(5件)

id:freemann No.1

freemann回答回数315ベストアンサー獲得回数502006/08/08 17:26:10

ポイント20pt

VB.NETで書かれてありますが、dobon.netさんのところよりわかりやすいかとも思いますので、参考にしてみてください。

http://www.ilovex.co.jp/Division/SRD/archives/2006/02/vbnet_...

id:masa182

回答ありがとうごさいます。プログラム経験が浅いためVB.NETだとちょっとわかりずらいです。これをC#に翻訳したもの、もしくは他のわかりやすいサイトなどはありますでしょうか?

2006/08/08 17:39:10
id:freemann No.2

freemann回答回数315ベストアンサー獲得回数502006/08/08 20:27:32

ポイント20pt

DataGridについて、よくわかってないのですが、コードを見てみると、自分が色を設定したい行の色を変えたいなら、行の値を変更せずに、参照する列でループすればよろしいのではないのでしょうか?


http://google.co.jp

id:masa182

回答ありがとうごさいます。業務が忙しくて返信遅くなり申し訳ありません。freemannさんの下記のソースを参考にさせていただきます

2006/08/11 09:02:28
id:afternoontea No.3

afternoontea回答回数9ベストアンサー獲得回数02006/08/09 00:47:38

ポイント20pt

http://d.hatena.ne.jp/afternoontea/20060808

基本はセル単位の色付けだと思います。

Paint()でGetColumnValueAtRow()の代わりに

sourceからDataRowViewを取得するとご要望の処理ができそうです。

DataRowView rowView = (DataRowView)source.List[rowNum];
HelloprojectDataSet.HelloprojectTableRow currentRow = (HelloprojectDataSet.HelloprojectTableRow)rowView.Row;

//Berryz工房の行は赤色で表示する
if (currentRow.Group == "Berryz工房")
{
    foreBrush = new SolidBrush(Color.White);
    backBrush = new SolidBrush(Color.Red);
}
id:masa182

回答ありがとうごさいます。業務が忙しくて返信遅くなり申し訳ありません。このソースはとてもわかりやすいのですが、私のプログラムだと

HelloprojectDataSet.HelloprojectTableRow currentRow

の部分に該当する箇所が他のクラスにあり、インスタンス化しても取得できません。たぶんオブジェクト思考を正しく理解していないだけだと思いますが、取得するうえでのポイントなどはあるのでしょうか?

2006/08/11 09:01:51
id:freemann No.4

freemann回答回数315ベストアンサー獲得回数502006/08/09 17:01:01

ポイント20pt

一応サンプルを作ってみました。

[環境]

VisualStudio.NET 2002

.NET FrameWork v1.0.3300

サンプルで使っているDBのテーブルは

テーブル名・・・NPC

カラム名・・・Name,Index

やっていることは、

上記のテーブルをDataTableに取得し、Index列のデータが5および7で割り切れるときは行を赤に、5で割り切れるときは青、7で割り切れるときは黄色に行を色づけしています。

それで、各行の色を設定するときに各行のすべてのカラムについて同じ色にするために、myColorTypeという配列に、先に条件によってどの色をつけるか計算しておいて、それによって頭文字をいれておきます。そして、MyDataGridTextBoxColumnクラスのPaintイベントでそのmyColorTypeの配列の値を各行で確認して、色を設定しています。


public class Form1 : System.Windows.Forms.Form

{

/// <summary>

/// 必要なデザイナ変数です。

/// </summary>

private System.ComponentModel.Container components = null;

private DataRow[] myRows;

public static string[] myColorType;

private void button2_Click(object sender, System.EventArgs e)

{

DataGridTableStyle ts = new DataGridTableStyle();

ts.MappingName = "NPC";

MyDataGridTextBoxColumn cs = new MyDataGridTextBoxColumn();

cs.MappingName = "Index";

ts.GridColumnStyles.Add(cs);

MyDataGridTextBoxColumn cs2 = new MyDataGridTextBoxColumn();

cs2.MappingName = "Name";

ts.GridColumnStyles.Add(cs2);

dataGrid1.TableStyles.Add(ts);

long iRow;

myColorType = new string[dataTable1.Rows.Count];

for( iRow = 0 ;iRow < dataTable1.Rows.Count;iRow++)

{

if(Convert.ToInt32(myRows[iRow].ItemArray[1]) % 5 == 0 && Convert.ToInt32(myRows[iRow].ItemArray[1]) % 7 == 0)

{

myColorType[iRow] = "R";

}

else if(Convert.ToInt32(myRows[iRow].ItemArray[1]) % 5 == 0)

{

myColorType[iRow] = "B";

}

else if(Convert.ToInt32(myRows[iRow].ItemArray[1]) % 7 == 0)

{

myColorType[iRow] = "Y";

}

else

{

myColorType[iRow] = "N";

}

}

}

}

public class MyDataGridTextBoxColumn : DataGridTextBoxColumn

{

protected override void Paint(Graphics g,

Rectangle bounds,

CurrencyManager source,

int rowNum,Brush backBrush,

Brush foreBrush,

bool alignToRight)

{

object cellValue =

this.GetColumnValueAtRow(source,rowNum);

if(cellValue != null && cellValue != DBNull.Value)

{

switch(Form1.myColorType[rowNum])

{

case "R":

foreBrush = new SolidBrush(Color.White);

backBrush = new SolidBrush(Color.Red);

break;

case "B":

foreBrush = new SolidBrush(Color.White);

backBrush = new SolidBrush(Color.Blue);

break;

case "Y":

foreBrush = new SolidBrush(Color.White);

backBrush = new SolidBrush(Color.Yellow);

break;

}

}

base.Paint(g,bounds,source,rowNum,backBrush,foreBrush,

alignToRight);

}

}


コードとしては、「ちょっといけないところ」 とかもあるかもしれませんが、その辺は直してもらえると助かります。

つたない説明でわかりづらいかも知れませんが・・・ご容赦を。

http://q.hatena.ne.jp/

id:masa182

回答ありがとうごさいます。今は時間の都合がつかなくてこのソースを試していないのですが、試し次第また投稿させていただきたいと思います。詳しいソースを書いていただきありがとうございます。

2006/08/11 09:04:59
id:afternoontea No.5

afternoontea回答回数9ベストアンサー獲得回数02006/08/13 21:58:22

ポイント20pt

私のプログラムだと

HelloprojectDataSet.HelloprojectTableRow currentRow

の部分に該当する箇所が他のクラスにあり、インスタンス化しても取得できません。たぶんオブジェクト思考を正しく理解していないだけだと思いますが、取得するうえでのポイントなどはあるのでしょうか?

ビルドは成功するけれども実行時にエラーになるということでしょうか?

GetType()を使ってキャストする型が合っているかを確認してみてください。

DataRowView rowView = (DataRowView)source.List[rowNum];

//インスタンスの型を確認します
//出力ウインドウに[Namespace.HelloprojectDataSet+HelloprojectTableRow]とでます
Debug.WriteLine(rowView.Row.GetType());

HelloprojectDataSet.HelloprojectTableRow currentRow = (HelloprojectDataSet.HelloprojectTableRow)rowView.Row;

http://msdn2.microsoft.com/ja-jp/library/system.object.getty...

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません