其改变CF中的行数据网格的背景有点复杂。
首先应该有一个ColumnStyle类继承自DataGridTextBoxColumn,您将在其中实现DataGridTextBoxColumn的绘制事件。
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;
}
}
要清楚我发布整个有关datagrid行的backcolor变化。我有2种方法(myStyle_CheckRowContains,myStyle_isEven)来决定我将排成行的背景颜色(黄色和绿色)。在我的数据网格中,我有4列从SQL到Datatable(dt)。我检查行1和1,如果行的第3列和第4列的值是相等的,然后我将行背景绘制为黄色。如果第三列的值大于第四列,那么我将背景涂成黄色。
我希望我能帮上忙。如果有什么你可以问。这个问题真的花了我一些宝贵的时间。我更改并实施了我在此处看到的内容:datagrid formatting
https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid.rowstyle(v=vs.110).aspx –
它没有解决这个环节我的问题 –