https://msdn.microsoft.com/zh-cn/library/7tas5c80(v=vs.110).aspx
微软提供了源码。可是本人英文不好 注释也看得一知半解的。
有没有更好的源码推荐一下。
求高手教下怎么样在datagridview里添加自定义控件
本人想添加的是 进度条 列
微软提供了源码。可是本人英文不好 注释也看得一知半解的。
有没有更好的源码推荐一下。
求高手教下怎么样在datagridview里添加自定义控件
本人想添加的是 进度条 列
解决方案
100
其实你也不太需要像微软示例那么复杂。
原因是你要的进度条,不需要复杂的编辑,只要显示处理好就行了。
原因是,最简单的你只要重载Paint画图函数:
原因是你要的进度条,不需要复杂的编辑,只要显示处理好就行了。
原因是,最简单的你只要重载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);
}
}