- PR -

DataGridの特定セルに対して色を変化させる

投稿者投稿内容
sakepower
会議室デビュー日: 2005/09/11
投稿数: 11
投稿日時: 2005-09-23 10:32
お世話になります。sakepowerです。

下記のようなコードを使い、あるDataGridのColumnごとの
条件で色を付けたいと思っていますがうまく記述できません。
条件とは、フォーム上にあるラベル(各Column名)のTextを使います。
例: <= byte.Parse(Column名+"label.Text")
です。

if ((byte)cellValue <= 20)

の部分に対し、記述のしかたが分かりません。
よろしければ、教えてください。



public DataColumn MyDataColumn;
public string MyColumnsName;
private void button1_Click(object sender, System.EventArgs e)
{
DataGridTableStyle ts = new DataGridTableStyle();
ts.MappingName = "DataTable1";

DataTable MyDataTable1 = testDataSet1.Tables["DataTable1"];
byte MyColumnsCount = (byte)MyDataTable1.Columns.Count;
for (byte Count = 0 ; Count<MyColumnsCount ; Count++)
{
MyDataColumn = MyDataTable1.Columns[Count];
MyColumnsName = MyDataColumn.ColumnName;

MyDataGridTextBoxColumn cs = new MyDataGridTextBoxColumn();

cs.MappingName = MyColumnsName;
cs.HeaderText = MyColumnsName;
ts.GridColumnStyles.Add(cs);
}
dataGrid1.TableStyles.Clear();
dataGrid1.TableStyles.Add(ts);

}

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)
{
if ((byte)cellValue <= 20)
{
foreBrush = new SolidBrush(Color.Red);
}
}
base.Paint(g, bounds, source, rowNum,backBrush, foreBrush, alignToRight);
}
}
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-23 11:47
こんにちは、じゃんぬ です。

引用:

sakepowerさんの書き込み (2005-09-23 10:32) より:

下記のようなコードを使い、


何故、そんなに byte 型に拘ってるんでしょう...

引用:

if ((byte)cellValue <= 20)

の部分に対し、記述のしかたが分かりません。
よろしければ、教えてください。


Column の Text を参照するなら、ToString して比較すべきだと思うんですが...


_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
sakepower
会議室デビュー日: 2005/09/11
投稿数: 11
投稿日時: 2005-09-23 12:23
じゃんぬ 様 返信ありがとうございます。
説明不足で申し訳ございません。フォーム上の各Columnの名前ついたラベルがあり
そのTextが数値になっていまして、その数値以下のデータに色を付けたいと
思っています。
if ((byte)cellValue <= 20) の「20」の部分にそのラベルを参照する変数を入れたい
のですが、変数の宣言のしかたがわかりません。
sakepower
会議室デビュー日: 2005/09/11
投稿数: 11
投稿日時: 2005-09-23 17:33
説明が不足していたと思いますので、追加させていただきます。

public string MylabeText;

foreach(object control in this.Controls)
{
    if(control.GetType().ToString() == "System.Windows.Forms.Label")
    {
      Label Mylabel =(Label)control;
      if(Mylabel.Name == MyColumnsName+"label")
      {
       MylabelText = Mylabel.Text;
      }
    }
}

とラベルを参照する変数:MylabelTextをif ((byte)cellValue <= 20)
の所に
if ((byte)cellValue <= byte.Parse(MylabelText))としても、
エラー:
「入れ子になっている型 'DataGrid.Form1.MyDataGridTextBoxColumn' を経由して、外の型 'DataGrid.Form1' の static でないメンバにアクセスすることはできません。」

となってしまいます。
これの回避のしかたが分かりません。 宜しくお願いいたします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-09-23 18:22
えーと、前景色はカラムごとに異なる、つまり逆に言えば縦一列は同じ色なんですよね?
同じDataGridTextBoxColumnであらわされるカラムは全て同じ色と。
でしたら、MyDataGridTextBoxColumnにForeColorか何か(あるいはIsOddColorとか)適当なプロパティを用意して、インスタンス作成時にセットしてやれば良いのではないでしょうか?
インスタンス作成時に必要な情報は全て揃っているのですから。
ラベルの文字が動的に変化するというのなら、そのラベルのTextChangedイベントで上記のプロパティを書き換えれば良いだけですし。
そうすれば、あとはPaintメソッド内でそのプロパティを参照して自身の前景色を決めるだけです。
sakepower
会議室デビュー日: 2005/09/11
投稿数: 11
投稿日時: 2005-09-23 19:13
Hongliang 様 返信ありがとうございます。
ラベルは動的に変化いたしません。
条件によってそのセルごとに前景色を変えたいと思っているので、
縦一列の前景色は同じとは限りません。

「MyDataGridTextBoxColumnにForeColorか何か(あるいはIsOddColorとか)適当なプロパティを用意して、インスタンス作成時にセットする」とはどの様に記述すればよろしいのでしょうか?

ちなみに現在はこのような感じです。読みづらくなっていまいましたが。

public DataColumn MyDataColumn;
public string MyColumnsName;
public string MylabelText;

private void button3_Click(object sender, System.EventArgs e)
{
  DataGridTableStyle ts = new DataGridTableStyle();
  ts.MappingName = "DataTable1";

  DataTable MyDataTable1 = testDataSet1.Tables["DataTable1"];
  byte MyColumnsCount = (byte)MyDataTable1.Columns.Count;
  for (byte Count = 0 ; Count<MyColumnsCount ; Count++)
  {
    MyDataColumn = MyDataTable1.Columns[Count];
    MyColumnsName = MyDataColumn.ColumnName;
     foreach(object control in this.Controls)
     {
     if(control.GetType().ToString() == "System.Windows.Forms.Label")
      {
Label Mylabel =(Label)control;
if(Mylabel.Name == MyColumnsName+"label")
{
  MylabelText = Mylabel.Text;
}
  }
}
MyDataGridTextBoxColumn cs = new MyDataGridTextBoxColumn();
cs.MappingName = MyColumnsName;
cs.HeaderText = MyColumnsName ts.GridColumnStyles.Add(cs);
  }
  dataGrid1.TableStyles.Clear();
  dataGrid1.TableStyles.Add(ts);
}

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)
  {
if ((byte)cellValue <= 20)
{
 foreBrush = new SolidBrush(Color.Red);
}
  }
  base.Paint(g, bounds, source, rowNum,backBrush, foreBrush, alignToRight);
  }
}


[ メッセージ編集済み 編集者: sakepower 編集日時 2005-09-23 19:22 ]
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-09-23 20:48
引用:

条件によってそのセルごとに前景色を変えたいと思っているので、
縦一列の前景色は同じとは限りません。



挙げられた条件を読む限り、列ごとに=カラムごとに単一色になると思うのですがね。
  • Labelはカラム(列)ごとに存在している。
  • それぞれのLabelはNameがカラム(列)名+labelである。
  • カラム(列)名に一致するLabelのTextで、そのカラム(列)の色を変更するかどうか決める。

これだけの条件だと判断して案を提示したんですが、そうでないのなら提案が全く意味を持たなくなる可能性が高いです。
何か他の条件が更に加わるんですか?
Labelはカラムごとでなくセルごとに存在しているとか?

まず条件を言葉で説明してみてください。
例えば、「ある特定の列の値がXX以下である行の前景色を全て赤色で表示したい」「ある特定の列の前景色を、任意の色に指定したい」という風に。
コードを書くのは仕様が決まってからです。

// カラムと言う言葉の扱いが微妙な予感
sakepower
会議室デビュー日: 2005/09/11
投稿数: 11
投稿日時: 2005-09-23 21:35
Hongliangs 様 返信ありがとうございます。

//値が"20以下"のセルの前景色を変える
if ((byte)cellValue <= 20)
{
  foreBrush = new SolidBrush(Color.Red);
}
の部分で
|Column1| カラム名:Column1 <---フィールド名?
---------
| 1 |
---------
| 2 |
---------
| 35 |
---------
上記のようなDataGridにデータ(1と2と35)がある場合35のセルのみ前景色がColor.Red
になるのでカラムごとに単一色にならないと思うのですが、

なんかへんなこといっていたら、申し訳ございません。

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