人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

現在C#でwindowsアプリケーションを作成しており、その中でデータグリッドの行の色を条件ごとに変化させるということをやろうとしています。
dobon.net(http://dobon.net/vb/dotnet/datagrid/coloredcell.html)さんのソースを参考にし、paintメソッドをオーバーライドすることでセル単位での色を変えることはできたのですが行単位での色の変更方法がまったくわかりません。どなたかご教授下さい。よろしくお願いします。

●質問者: masa182
●カテゴリ:コンピュータ インターネット
✍キーワード:.NET C# Windows アプリケーション オーバー
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● freemann
●20ポイント

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

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

◎質問者からの返答

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


2 ● freemann
●20ポイント

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


http://google.co.jp

◎質問者からの返答

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


3 ● afternoontea
●20ポイント

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);
}
◎質問者からの返答

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

HelloprojectDataSet.HelloprojectTableRow currentRow

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


4 ● freemann
●20ポイント

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

[環境]

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/

◎質問者からの返答

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


5 ● afternoontea
●20ポイント

私のプログラムだと

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...

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ