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); } }