Winform中DataGridView单元格内容字体突出显示

 

Winform中DataGridView单元格内容字体突出显示
这是给某某做查询功能时想到的,关键字查询的时候,有时候会出现查询结果较多的情况。为了清晰地从查询结果找到目的行,想到在结果内容中突出显示关键字以方便找到目的行。
Winform中DataGridView里只能控制某个单元格里所有内容的颜色,但不能控制部分内容的颜色,既然这样,唯有自己画上去!
效果:例如在textbox分别输入“延”“延强”“萧延强”,结果

输入154,结果

我的这个办法主要通过触发DataGridView的 CellPainting事件来进行重绘制,要做的就两步:
1. 确定你要重绘的单元格
     这个嘛,要根据具体的显示需求来定,用逻辑办法确定需要绘制的单元格。
     以上面的图片为例,当我向textbox输入数字时,“个人编号”列的单元格突出显示;输入汉字时,“姓名”列的单元格突出显示。
2. 重绘单元格
     重点说说这里,重绘单元格,两个步骤:
     a. 计算
     由于有 DataGridViewCellPaintingEventArgs的便利,单元格的坐标等信息都不需要计算,要计算的只单元格内容的位置和其关键字的位置。
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->string cellword = (string)e.Value;          // 单元格原文本
string keyword = textBox1.Text.Trim();      // 关键字

// ***计算绘制位置***
Rectangle keywordBound = e.CellBounds;      //关键字区域,默认定义为单元格大小
Rectangle valueBound = e.CellBounds;        //单元格内容区域,默认定义为单元格大小
float fontSizeWeight = 96 / (72 / e.CellStyle.Font.Size); // 字体实际像素宽度
float fontSizeHeight = 96 / (72 / e.CellStyle.Font.Size); // 字体实际像素高度
if (IsChinese())    //是否汉字,是则字体宽度乘2
    fontSizeWeight = fontSizeWeight * 2;
else
    fontSizeWeight;

// 关键字的坐标
keywordBound.X += cellword.Substring(0, cellword.IndexOf(keyword)).Length * (int)(fontSizeWeight / 2);
keywordBound.Y += (e.CellBounds.Height - (int)fontSizeHeight) / 2;

// 原文本的Y坐标
valueBound.Y = keywordBound.Y;

     b. 绘制
     绘制按照一层层地绘制,背景->原文字->关键字。
     .NET给我们提供了方便的PaintBackground函数,其作用就是绘制单元格背景。
     只要计算好文字绘制的位置,使用Graphics.DrawString函数也能方便地绘制,达到效果
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->// ***绘制***
using (Brush foreColorBrush = new SolidBrush(e.CellStyle.ForeColor), keywordColorBrush = new SolidBrush(Color.Red))
{
    // 绘制背景
    e.PaintBackground(e.ClipBounds, false);

    // 绘制背景(被选中时)
    if (e.State == (DataGridViewElementStates.Selected | DataGridViewElementStates.Displayed | DataGridViewElementStates.Visible))
        e.PaintBackground(e.ClipBounds, true);

    // 绘制原文本
    e.Graphics.DrawString(cellword, e.CellStyle.Font, foreColorBrush, valueBound, StringFormat.GenericDefault);

    // 在原文本上绘制红色关键字
    e.Graphics.DrawString(keyword, e.CellStyle.Font, keywordColorBrush, keywordBound, StringFormat.GenericDefault);

    // 已完成事件处理,继续本身处理
    e.Handled = true;
}

至此,只能说这并不是什么技巧,不过是日常的处理办法,但在这里拿来与大家分享一下。有错误的或者有更好的建议,欢迎指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值