CFのDataGridの行の背景色を変更するのが少し複雑です。
まず、DataGridTextBoxColumnのペイントイベントを実装するDataGridTextBoxColumnから継承するColumnStyleクラスが必要です。
namespace SmartBox
{
public delegate void CheckCellEventHandler(object sender, DataGridEnableEventArgs e);
public class DataGridEnableEventArgs : EventArgs
{
private int _column;
private int _row;
private bool _meetsCriteria;
public DataGridEnableEventArgs(int row, int col)//
{
_row = row;
_column = col;
}
public DataGridEnableEventArgs(int row, int col, bool val)//
{
_row = row;
_column = col;
_meetsCriteria = val;
}
public int Column
{
get { return _column; }
set { _column = value; }
}
public int Row
{
get { return _row; }
set { _row = value; }
}
public bool MeetsCriteria
{
get { return _meetsCriteria; }
set { _meetsCriteria = value; }
}
}
class ColumnStyle : DataGridTextBoxColumn
{
public event CheckCellEventHandler CheckCellEven;
public event CheckCellEventHandler CheckRowContains;
private int _col;
public ColumnStyle(int column)
{
_col = column;
}
protected override void Paint(Graphics g, Rectangle Bounds, CurrencyManager Source, int RowNum, Brush BackBrush, Brush ForeBrush, bool AlignToRight)
{
bool enabled = true;
if (CheckCellEven != null)
{
DataGridEnableEventArgs e = new DataGridEnableEventArgs(RowNum,_col, enabled);//, _col
CheckCellEven(this, e);
if (e.MeetsCriteria)
BackBrush = new SolidBrush(Color.PaleGreen);
}
if (CheckRowContains != null)
{
DataGridEnableEventArgs e = new DataGridEnableEventArgs(RowNum, _col, enabled);
CheckRowContains(this, e);
if (e.MeetsCriteria)
{
BackBrush = new SolidBrush(Color.Yellow);
}
}
base.Paint(g, Bounds, Source, RowNum, BackBrush, ForeBrush, AlignToRight);
}
}
とメインフォームで、あなたが行背景色をペイントしますどのような条件で決めます。
private void addGridStyle(ref DataGrid dg, DataTable cem)
{
DataGridTableStyle dtStyle = new DataGridTableStyle();
dtStyle.MappingName = cem.TableName;
for (int i = 0; i < dt.Columns.Count; i++)
{
ColumnStyle myStyle = new ColumnStyle(i);
myStyle.MappingName = dt.Columns[i].ColumnName;
if (dt.Columns[i].ColumnName == "urunadi" || dt.Columns[i].ColumnName == "urunkodu" || dt.Columns[i].ColumnName == "toplanan_miktar" || dt.Columns[i].ColumnName == "miktar")
myStyle.CheckCellEven += new CheckCellEventHandler(myStyle_isEven);
if (dt.Columns[i].ColumnName == "urunadi" || dt.Columns[i].ColumnName == "urunkodu" || dt.Columns[i].ColumnName == "toplanan_miktar" || dt.Columns[i].ColumnName == "miktar")
myStyle.CheckRowContains += new CheckCellEventHandler(myStyle_CheckRowContains);
dtStyle.GridColumnStyles.Add(myStyle);
}
dg.TableStyles.Add(dtStyle);
dg.ColumnHeadersVisible = true;
}
public void myStyle_isEven(object sender, DataGridEnableEventArgs e)
{
try
{
if ((int)toplamaGrid[e.Row, 2] == (int)toplamaGrid[e.Row, 3])
e.MeetsCriteria = true;
else
e.MeetsCriteria = false;
}
catch (Exception ex)
{
e.MeetsCriteria = false;
}
}
public void myStyle_CheckRowContains(object sender, DataGridEnableEventArgs e)
{
try
{
if (((int)toplamaGrid[e.Row, 2] > (int)toplamaGrid[e.Row, 3]) && (int)toplamaGrid[e.Row, 3] > 0)
e.MeetsCriteria = true;
else
e.MeetsCriteria = false;
}
catch (Exception ex)
{
e.MeetsCriteria = false;
}
}
明確にするには、データグリッド行の背景色の変更について全体を投稿します。
2つのメソッド(myStyle_CheckRowContains、myStyle_isEven)を使用して、どの色を行の背景にするかを決定します(黄色と緑色)。私のDataGridには、SQLからDatatable(dt)に変換される4つのカラムがあります。私は行1をチェックし、行の3列目と4列目の値が等しい場合、行の背景を黄色にペイントします。 3番目の列の値が4番目の列より大きい場合は、背景を黄色に塗ります。
私は助けてくれることを願っています。何かがある場合は、あなたに聞くことができます。この問題は実際に私の貴重な時間の一部を取る。私はここで見たものを変更して実装しました:datagrid formatting
https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.rowstyle(v=vs.110).aspx –
そのリンクを解決していない私の問題 –