当前位置:编程学习 > C#/ASP.NET >>

WINFROM 的挑战!WINFROM datagridview 的问题,希望高手来解决,急!!!!!!!!

WINFROM datagridview中设置单元格中某个字的颜色,我能做到,参照的是:

http://hi.baidu.com/xiangboren/blog/item/1bbf9fd422ebc50ca08bb7b5.html/cmtid/7f213a73af381d128601b0a3

但是只要单元格中的内容换行就不行了,我也试图解决,但是一直未果。。。希望高手来啊。。。。。


谢谢大家。。。。 --------------------编程问答-------------------- wo ding !!! --------------------编程问答-------------------- 无代码,无真相。 --------------------编程问答-------------------- 我顶啊。。

代码如下:

输入154,结果



我的这个办法主要通过触发DataGridView的CellPainting事件来进行重绘制,要做的就两步:

1. 确定你要重绘的单元格

      这个嘛,要根据具体的显示需求来定,用逻辑办法确定需要绘制的单元格。

      以上面的图片为例,当我向textbox输入数字时,“个人编号”列的单元格突出显示;输入汉字时,“姓名”列的单元格突出显示。

2. 重绘单元格

      重点说说这里,重绘单元格,两个步骤:

      a. 计算

      由于有DataGridViewCellPaintingEventArgs的便利,单元格的坐标等信息都不需要计算,要计算的只单元格内容的位置和其关键字的位置。

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函数也能方便地绘制,达到效果

// ***绘制***
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;
--------------------编程问答-------------------- 定 ! --------------------编程问答-------------------- ding!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,