将DataGrid中满足条件的行设为不同的背景色(WinForm).

datagrid|条件

由于项目需要, 需要对DataGrid的数据行, 按不同的条件以不同的背景色相区别。 由于DataGrid中没有相关的属性和方法可以直接设置,要完成这个功能还挺费些功夫。在网上搜了半天,也没找到解决方案。只好自己动手,丰衣足食了,:) 。研究了半天, 终于搞定它了。好东西不敢独享,特贴出来,希望能给需要的人带来些帮助。

{

//...

//使用DataGridTableStyle 显示DataGrid.

DataGridTableStyle tableStyle = new DataGridTableStyle();
tableStyle.MappingName = "customers";

int numCols = _dataSet.Tables["customers"].Columns.Count;
DataGridCellColorTextBoxColumn columnTextColumn ;
for(int i = 0; i < numCols; ++i)
{
columnTextColumn = new DataGridCellColorTextBoxColumn();
columnTextColumn.HeaderText = _dataSet.Tables["customers"].Columns[i].ColumnName;
columnTextColumn.MappingName = _dataSet.Tables["customers"].Columns[i].ColumnName;

//为每个单元格建立设置背景色的事件.
columnTextColumn.CheckCellColor += new CellColorEventHandler(SetColorValues);

tableStyle.GridColumnStyles.Add(columnTextColumn);
}

dataGrid1.TableStyles.Clear();
dataGrid1.TableStyles.Add(tableStyle);

dataGrid1.DataSource = _dataSet.Tables["customers"];

}

public void SetColorValues(object sender, DataGridCellColorEventArgs e)
{
//根据条件, 将相关行设置不同的背景色.
//下例为国家(datagrid中第9列)为Mexico的行设置为红色,USA的行设为黄色.
if(Convert.ToString(dataGrid1[e.Row,8]) == "Mexico")
e.BackColor = Color.Red;
else if(Convert.ToString(dataGrid1[e.Row,8]) == "USA")
e.BackColor = Color.Yellow;
}

public class DataGridCellColorEventArgs : EventArgs
{
private int _row;
private Color _backcolor;

public DataGridCellColorEventArgs(int row, Color val)
{
_row = row;
_backcolor = val;
}
public int Row
{
get{ return _row;}
set{ _row = value;}
}
public Color BackColor
{
get{ return _backcolor;}
set{ _backcolor = value;}
}
}

//为事件建立委托.
public delegate void CellColorEventHandler(object sender, DataGridCellColorEventArgs e);

public class DataGridCellColorTextBoxColumn : DataGridTextBoxColumn
{
public event CellColorEventHandler CheckCellColor;

public DataGridCellColorTextBoxColumn()
{
}

//继承DataGridTextBoxColumn的Pain事件.
protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle bounds, System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Brush backBrush, System.Drawing.Brush foreBrush, bool alignToRight)
{
if(CheckCellColor != null)
{
//重绘画时,设置当前行的背景色
DataGridCellColorEventArgs e = new DataGridCellColorEventArgs(rowNum, Color.White);
CheckCellColor(this, e);

if(e.BackColor != Color.White)
backBrush = new SolidBrush(e.BackColor);
}

base.Paint(g, bounds, source, rowNum, backBrush, foreBrush, alignToRight);
}

protected override void Edit(System.Windows.Forms.CurrencyManager source, int rowNum, System.Drawing.Rectangle bounds, bool readOnly, string instantText, bool cellIsVisible)
{
base.Edit(source, rowNum, bounds, readOnly, instantText, cellIsVisible);
}
}

时间: 2024-10-28 23:04:40

将DataGrid中满足条件的行设为不同的背景色(WinForm).的相关文章

怎样从DataGrid中随机抽取N行,显示在另一个窗口的datagrid里

问题描述 从textbox里获取N的大小,然后从Datagrid中抽取数据,显示在另一个窗口的DataGrid里 解决方案 解决方案二:DataGrid的数据源也是查询的吧,你把上面的数据源作为表SELECTTOPN*FROM(DataGrid的数据源的查询语句)orderbynewid()这是随机抽取N条数据的方法

在DATAGRID中使用分类标题

datagrid 在asp.net中,DATAGRID是使用频率比较高的控件,而在日常应用中,如何在DATAGRID中使用分类标题呢? 什么是分类标题呢?举个例子,我们在使用DATAGRID时,都以一定的顺序来显示有关的数据,比如在使用ms sql server的Northwind数据库时,在product产品表中,每一个产品都是属于一个类别,这些类别在category表中定义.那么我们可以按照category表中类别的顺序,在DATAGRID中显示每个类别有哪些产品. 从上面的图中,可以看出,

为DataGrid中的行增加序号!

datagrid 有时,你需要为在DataGrid中显示每行的序号,如果使用Oracle数据库,你可以利用RowNum在Select命令中构造行序号,然后直接绑定到DataGrid,但是如果用的是SQL Server数据库,那么,该如何为Datagrid中增加行序号呢? ADO.NET中通过DataColumn的3个属性来支持自动增量列:AutoIncrement,AutoIncrementSeed,AutoIncrementStep.只要将DataColumn的AutoIncrement设置为

easyui-easyUI先提交form表单做条件查询返回的结果加载到datagrid中,应该怎么做?

问题描述 easyUI先提交form表单做条件查询返回的结果加载到datagrid中,应该怎么做? 我是这么写的,但是这样form表单提交不到后台去,不知道怎么做 $('#tt').datagrid({ pageNumber : curr url : $('#bas').val() + '/showUser.action' onLoadSuccess : function() { } onLoadError : function() { $('#tt').datagrid('appendRow'

如何去掉Datagrid中的新增行

datagrid   在编程中我们经常遇到这样的问题,我们想要Datagrid的readonly属性为False,直接在Datagrid中修改数据.但又不想让它出现新增的行,这个问题很多网友发贴问过,事实上实现起来非常简单,只是大家没想到而已.下面通过一个简单示例说明之 首先在界面中添加一个Datagrid和一个Button按钮,Name为默认值,双击Button1编写以下代码.     Private Sub Button1_Click(ByVal sender As System.Objec

DataGrid常见解决方案(三)--在DataGrid中选择,确认,删除多行复选框列表

datagrid|复选框|解决 在DataGrid中选择,确认,删除多行复选框列表 Selecting, Confirming & Deleting Multiple Checkbox Items In A DataGrid (i.e. HotMail & Yahoo) Introduction Although I don't have either a Hotmail or Yahoo email account, I do have friends that do, and I ha

在 Web DataGrid 中当鼠标移到某行与离开时行的颜色发生改变(结合&amp;#106avascript)

datagrid|web 在head中添加javascript 代码如下: <script lang=javascript> function sel(i) // 鼠标移上去后执行 {  eval(i+".style.background='#CCCC66'"); // 更改行的颜色  eval(i+".style.cursor='hand'"); // 鼠标移上去后变为手形 } function unsel(i) // 鼠标离开后执行 {  eval(

在datagrid中,批量修改几行数据后,被修改的行怎么被复制了

问题描述 在datagrid中,批量修改几行数据后,被修改的行怎么被复制了 例如 我修改了第1,2行的状态列,修改完后,网格上显示有两个1,两个2,这是怎么回事 解决方案 巧用excel批量修改数据批量修改数据批量修改多表数据 解决方案二: 如果是对象,要深拷贝,否则修改的是同一个对象

发送-datagrid中怎么删除选中的行????

问题描述 datagrid中怎么删除选中的行???? 不管是多选,还是单选,在表格上集成的有增加,删除,修改按钮.我现在想问,当我点击某一行的时候,怎么取出来对应行的各个数据?????因为这个datagrid是个集成的框架,不是自己写的table,对里面的语法,还有数据对象取值不知道怎么用,如果能取出来值,我就可以用Ajax发送到后台进行处理.现在就问你,怎么去table对象,row对象,cell对象,语法是什么????????????????????????????????? 解决方案 htt