请选择 进入手机版 | 继续访问电脑版

无忧编程_ASP.NET  / C# / PHP 程序员的软件世界

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 74|回复: 0

扩展DataGridView功能让单元格指定文本能显示不能颜色和字体及大小的方法详解

[复制链接]

337

主题

367

帖子

1511

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1511
发表于 2018-6-5 16:09:20 | 显示全部楼层 |阅读模式
扩展DataGridView功能让单元格指定文本能显示不能颜色和字体及大小的方法详解
DataGridView 的功能还是很强大的,每个cell都可以设置单独的style,可以打造出非常漂亮的效果。
但是如何让同一个 cell 里的文字设置不同的 style 呢, 比如像下图这样
有了前面的基础,相信扩展这个功能还是比较简单的, 总体来说就是重写 Cell 的 Paint 方法,想怎么画就怎么画
但是如何表示这种富文本的结构呢?想了一会,还是觉得用 html 标签来表示就行了。
上图中得文本用 html 标签来表示就变成了
string text = "[size=\"14\"][color=\"red\"]少年[size=\"16\"][color=\"blue\"]张三丰";
然后写一个简单的 html parser 解析它就行了。
主要代码如下
[C#] 纯文本查看 复制代码
void PaintText(Graphics g, Rectangle rect, string text, bool selected, DataGridViewCellStyle cell_style)
        {
            Document = parser.parse_text(text);
            Point pt = rect.Location;
            foreach (var node in Document.Nodes)
            {
                Font font = get_node_font(node, cell_style);
                Color clr = get_node_color(node, selected, cell_style);
                Size size = TextRenderer.MeasureText(node.InnerText, font);
                pt.Y = rect.Top + (rect.Height - size.Height) / 2;
                using (Brush bru = new SolidBrush(clr))
                {
                    g.DrawString(node.InnerText, font, bru, pt);
                }
                pt.X += size.Width;
            }
        }
 
        Font get_node_font(DOMNode node, DataGridViewCellStyle cell_style)
        {
            Font font = cell_style.Font;
            if (node.Name == "font" && node.Attributes.ContainsKey("name") && node.Attributes.ContainsKey("size"))
            {
                float font_size = cell_style.Font.Size;
                float.TryParse(node.Attributes["size"], out font_size);
                font = new Font(node.Attributes["name"], font_size);
            }
            return font;
        }
 
        Color get_node_color(DOMNode node, bool selected, DataGridViewCellStyle cell_style)
        {
            Color clr = selected ? cell_style.SelectionForeColor : cell_style.ForeColor;
            if (node.Name == "font" && node.Attributes.ContainsKey("color"))
            {
                clr = ColorTranslator.FromHtml(node.Attributes["color"]);
                if (selected)
                    clr = Color.FromArgb(~(clr.ToArgb()&0x00FFFFFF));
            }
            return clr;
 
        } 

1346234279_6628.png

CSDN完整代码下载:http://download.csdn.net/detail/huwei001982/4534804文章转自:https://bbs.csdn.net/topics/390193830#r_79550662

DataGridRichTextBoxColumn.zip

125.57 KB, 下载次数: 0

源代码下载

windows .net(C#+MSSQL) linux(php+mysql)  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|软件编程 ( 鄂ICP备11006601号鄂公网安备 42011102001337号 |

GMT+8, 2018-6-21 18:00 , Processed in 0.207588 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表