Code Bye

WinForm的datagriview自定义控件

https://msdn.microsoft.com/zh-cn/library/7tas5c80(v=vs.110).aspx
微软提供了源码。可是本人英文不好  注释也看得一知半解的。
有没有更好的源码推荐一下。
求高手教下怎么样在datagridview里添加自定义控件
本人想添加的是  进度条 列
解决方案

100

其实你也不太需要像微软示例那么复杂。
原因是你要的进度条,不需要复杂的编辑,只要显示处理好就行了。
原因是,最简单的你只要重载Paint画图函数:
using System;
using System.Drawing;
using System.Windows.Forms;
public class DataGridViewProgressColumn : DataGridViewColumn
{
    public DataGridViewProgressColumn()
    {
        CellTemplate = new DataGridViewProgressCell();
    }
    class DataGridViewProgressCell : DataGridViewTextBoxCell
    {
        protected override void Paint(
            Graphics g, Rectangle clip, Rectangle cellBounds,
            int row, DataGridViewElementStates cellState,
            object value, object formattedValue, string error,
            DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle borderStyle,
            DataGridViewPaintParts paintParts)
        {
            // 画背景,包括单元格的框,底色等等。
            var parts = paintParts & ~(DataGridViewPaintParts.ContentForeground | DataGridViewPaintParts.SelectionBackground);
            base.Paint(g, clip, cellBounds, row, cellState, value, formattedValue, error, cellStyle, borderStyle, parts);
            // 画进度条
            float percent = 0;
            bool isNumber = float.TryParse(Convert.ToString(value), out percent);
            var rect = cellBounds; rect.Inflate(-10, -4);
            int chunkWidth = Math.Max(0, Math.Min((int)(rect.Width * percent) / 100, rect.Width));
            ProgressBarRenderer.DrawHorizontalBar(g, rect);
            ProgressBarRenderer.DrawHorizontalChunks(g, new Rectangle(rect.X, rect.Y, chunkWidth, rect.Height));
            // 叠加文字
            g.DrawString(value + (isNumber ? "%" : ""), cellStyle.Font, SystemBrushes.ControlText, rect, certeredFormat);
        }
        static StringFormat certeredFormat = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
    }
}

测试。
1、新建一个WinForm项目
2、拷入上述代码。
3、替换Form1.cs为以下内容:

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            DataGridView dgv = new DataGridView() { Dock = DockStyle.Fill, EditMode = DataGridViewEditMode.EditOnEnter};
            dgv.Columns.Add(new DataGridViewTextBoxColumn() { DataPropertyName = "Name" });
            dgv.Columns.Add(new DataGridViewProgressColumn() { DataPropertyName = "Progress" });
            DataTable table = new DataTable();
            table.Columns.Add("Name");
            table.Columns.Add("Progress");
            table.Rows.Add("完成", 100);
            table.Rows.Add("一半", 50);
            dgv.DataSource = table;
            this.Controls.Add(dgv);
        }
    }

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明WinForm的datagriview自定义控件