注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

III = Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

[原创]DataGridView中重绘单元格  

2017-04-12 16:23:01|  分类: C# & .NET |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
MSDN中有一个单元格重绘的例子,链接如下:

研究了一下这个例子之后,我也尝试做了一个类似进度条的显示方式,先上效果:
DataGridView中重绘单元格 - Lemniscate - 信息 灵感 创新
 实现的原理是使用了CellPainting事件,上代码:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace dgvTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //Add Column Title
            dgv.ColumnCount = 3;
            dgv.Columns[0].Name = "姓名";
            dgv.Columns[1].Name = "性别";
            dgv.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable; 
            dgv.Columns[2].Name = "战斗力";
            //Add Rows
            string[] row0 = { "Alpha", "男", "12"};
            string[] row1 = { "Betty", "女", "76" };
            string[] row2 = { "Castor", "男", "98" };
            string[] row3 = { "Dorothy", "女", "45" };
            dgv.Rows.Add(row0);
            dgv.Rows.Add(row1);
            dgv.Rows.Add(row2);
            dgv.Rows.Add(row3);
            dgv.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
        }

        private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if (this.dgv.Columns["战斗力"].Index ==e.ColumnIndex && e.RowIndex >= 0)
            {
                //先将单元格内容清屏
                //实际上就是用底色刷子填充
                //当然也可以换成其他的颜色
                e.Graphics.FillRectangle(new SolidBrush(e.CellStyle.BackColor), e.CellBounds);

                //绘制边框线条
                Pen lpen = new Pen(dgv.GridColor);
                //下
                e.Graphics.DrawLine(
                    lpen, e.CellBounds.Left,
                    e.CellBounds.Bottom - 1, 
                    e.CellBounds.Right - 1,
                    e.CellBounds.Bottom - 1);
                //右
                e.Graphics.DrawLine(
                    lpen, 
                    e.CellBounds.Right - 1,
                    e.CellBounds.Top, 
                    e.CellBounds.Right - 1,
                    e.CellBounds.Bottom);
                //用刷子填充百分比
                if (e.Value != null)
                {
                    SolidBrush foreSB = new SolidBrush(Color.Lime);
                    int ev = Convert.ToInt16(e.Value);
                    //宽度
                    float fw = ev * (e.CellBounds.Width - 1) / 100f;
                    RectangleF fr = new RectangleF(e.CellBounds.X + 1, e.CellBounds.Y + 1, fw, e.CellBounds.Height - 2);
                    e.Graphics.FillRectangle(foreSB, fr);
                    StringFormat df = new StringFormat();
                    df.Alignment = StringAlignment.Center;
                    df.LineAlignment = StringAlignment.Center;
                    e.Graphics.DrawString((String)e.Value, e.CellStyle.Font, Brushes.Red, e.CellBounds, df);
                }
                e.Handled = true;
            }
        }
    }
}
在摸清了这个套路之后,基本思路就是清晰明了的:为DataGridView添加事件绑定,在事件参数的图形对象上作画,唯一需要注意的是,Graphics所使用的坐标是在DataGridView中的绝对坐标,后面的绘制就非常简单了,什么样的表现形式,完全取决于GID+所提供的功能,以及你的创意。
例如,稍微用点功夫,使用LinearGradientBrush,修改一下代码,就可以得到那种热力图的效果:
DataGridView中重绘单元格 - Lemniscate - 信息 灵感 创新
 思路也很简单:先在单元格中绘制完整的彩色条带,然后把右边不显示的部分,用和单元格底色相同的矩形填充。
  评论这张
 
阅读(59)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017