源码如下
此代码为转载
//定义进度条列 public class DataGridViewProgressBarColumn : DataGridViewTextBoxColumn { public DataGridViewProgressBarColumn() { this.CellTemplate = new DataGridViewProgressBarCell(); } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { if (!(value is DataGridViewProgressBarCell)) { throw new InvalidCastException("DataGridViewProgressBarCell" + "指定。"); } base.CellTemplate = value; } } /// <summary> /// ProgressBarの最大値 /// </summary> public int Maximum { get { return ((DataGridViewProgressBarCell)this.CellTemplate).Maximum; } set { if (this.Maximum == value) return; ((DataGridViewProgressBarCell)this.CellTemplate).Maximum = value; if (this.DataGridView == null) return; int rowCount = this.DataGridView.RowCount; for (int i = 0; i < rowCount; i++) { DataGridViewRow r = this.DataGridView.Rows.SharedRow(i); ((DataGridViewProgressBarCell)r.Cells[this.Index]).Maximum = value; } } } /// <summary> /// ProgressBarの最小値 /// </summary> public int Mimimum { get { return ((DataGridViewProgressBarCell)this.CellTemplate).Mimimum; } set { if (this.Mimimum == value) return; ((DataGridViewProgressBarCell)this.CellTemplate).Mimimum = value; if (this.DataGridView == null) return; int rowCount = this.DataGridView.RowCount; for (int i = 0; i < rowCount; i++) { DataGridViewRow r = this.DataGridView.Rows.SharedRow(i); ((DataGridViewProgressBarCell)r.Cells[this.Index]).Mimimum = value; } } } } /// <summary> /// ProgressBar DataGridView表示 /// </summary> public class DataGridViewProgressBarCell : DataGridViewTextBoxCell { public DataGridViewProgressBarCell() { this.maximumValue = 100; this.mimimumValue = 0; } private int maximumValue; public int Maximum { get { return this.maximumValue; } set { this.maximumValue = value; } } private int mimimumValue; public int Mimimum { get { return this.mimimumValue; } set { this.mimimumValue = value; } } public override Type ValueType { get { return typeof(int); } } public override object DefaultNewRowValue { get { return 0; } } public override object Clone() { DataGridViewProgressBarCell cell = (DataGridViewProgressBarCell)base.Clone(); cell.Maximum = this.Maximum; cell.Mimimum = this.Mimimum; return cell; } protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { int intValue = 0; if (value is int) intValue = (int)value; if (intValue < this.mimimumValue) intValue = this.mimimumValue; if (intValue > this.maximumValue) intValue = this.maximumValue; double rate = (double)(intValue - this.mimimumValue) / (this.maximumValue - this.mimimumValue); if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border) { this.PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); } Rectangle borderRect = this.BorderWidths(advancedBorderStyle); Rectangle paintRect = new Rectangle( cellBounds.Left + borderRect.Left, cellBounds.Top + borderRect.Top, cellBounds.Width - borderRect.Right, cellBounds.Height - borderRect.Bottom); bool isSelected = (cellState & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected; Color bkColor; if (isSelected && (paintParts & DataGridViewPaintParts.SelectionBackground) == DataGridViewPaintParts.SelectionBackground) { bkColor = cellStyle.SelectionBackColor; } else { bkColor = cellStyle.BackColor; } if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background) { using (SolidBrush backBrush = new SolidBrush(bkColor)) { graphics.FillRectangle(backBrush, paintRect); } } paintRect.Offset(cellStyle.Padding.Right, cellStyle.Padding.Top); paintRect.Width -= cellStyle.Padding.Horizontal; paintRect.Height -= cellStyle.Padding.Vertical; if ((paintParts & DataGridViewPaintParts.ContentForeground) == DataGridViewPaintParts.ContentForeground) { if (ProgressBarRenderer.IsSupported) { ProgressBarRenderer.DrawHorizontalBar(graphics, paintRect); Rectangle barBounds = new Rectangle( paintRect.Left + 3, paintRect.Top + 3, paintRect.Width - 4, paintRect.Height - 6); barBounds.Width = (int)Math.Round(barBounds.Width * rate); ProgressBarRenderer.DrawHorizontalChunks(graphics, barBounds); } else { graphics.FillRectangle(Brushes.White, paintRect); graphics.DrawRectangle(Pens.Black, paintRect); Rectangle barBounds = new Rectangle( paintRect.Left + 1, paintRect.Top + 1, paintRect.Width - 1, paintRect.Height - 1); barBounds.Width = (int)Math.Round(barBounds.Width * rate); graphics.FillRectangle(Brushes.Blue, barBounds); } } if (this.DataGridView.CurrentCellAddress.X == this.ColumnIndex && this.DataGridView.CurrentCellAddress.Y == this.RowIndex && (paintParts & DataGridViewPaintParts.Focus) == DataGridViewPaintParts.Focus && this.DataGridView.Focused) { Rectangle focusRect = paintRect; focusRect.Inflate(-3, -3); ControlPaint.DrawFocusRectangle(graphics, focusRect); } if ((paintParts & DataGridViewPaintParts.ContentForeground) == DataGridViewPaintParts.ContentForeground) { string txt = string.Format("{0}%", Math.Round(rate * 100)); TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter; Color fColor = cellStyle.ForeColor; paintRect.Inflate(-2, -2); TextRenderer.DrawText(graphics, txt, cellStyle.Font, paintRect, fColor, flags); } if ((paintParts & DataGridViewPaintParts.ErrorIcon) == DataGridViewPaintParts.ErrorIcon && this.DataGridView.ShowCellErrors && !string.IsNullOrEmpty(errorText)) { Rectangle iconBounds = this.GetErrorIconBounds(graphics, cellStyle, rowIndex); iconBounds.Offset(cellBounds.X, cellBounds.Y); this.PaintErrorIcon(graphics, iconBounds, cellBounds, errorText); } } }代码如下
public class WDataGridViewColumn_Progress : DataGridViewImageColumn { public WDataGridViewColumn_Progress() { this.CellTemplate = new WDataGridViewCell_Progress(); this.HeaderText = "Operate"; } } public class WDataGridViewCell_Progress : DataGridViewImageCell { // Used to make custom cell consistent with a DataGridViewImageCell 用于使自定义单元格与DataGridViewImageCell保持一致 static Image emptyImage; static WDataGridViewCell_Progress() { emptyImage = new Bitmap(1, 1, System.Drawing.Imaging.PixelFormat.Format32bppArgb); } public WDataGridViewCell_Progress() { this.ValueType = typeof(int); } // Method required to make the Progress Cell consistent with the default Image Cell. 方法,以使进度单元格与默认图像单元格保持一致。 // The default Image Cell assumes an Image as a value, although the value of the Progress Cell is an int. 默认的图像单元格假设图像是一个值,尽管Progress单元格的值是int。 protected override object GetFormattedValue(object value, int rowIndex, ref DataGridViewCellStyle cellStyle, TypeConverter valueTypeConverter, TypeConverter formattedValueTypeConverter, DataGridViewDataErrorContexts context) { return emptyImage; } /// <summary> /// 对单元格的重绘事件进行的方法重写。 /// </summary> protected override void Paint(System.Drawing.Graphics g, System.Drawing.Rectangle clipBounds, System.Drawing.Rectangle cellBounds, int rowIndex, DataGridViewElementStates cellState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { float progressVal; if (value != null) progressVal = Convert.ToSingle(value); else progressVal = 10; float percentage = ((float)progressVal / 100.0f); // Need to convert to float before division; otherwise C# returns int which is 0 for anything but 100%. 除法前需要转换为浮点数;否则,c#将返回int值,该值对于除100%以外的任何值都为0。 Brush backColorBrush = new SolidBrush(cellStyle.BackColor); Brush foreColorBrush = new SolidBrush(cellStyle.ForeColor); // Draws the cell grid 绘制单元格 base.Paint(g, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, (paintParts & ~DataGridViewPaintParts.ContentForeground)); StringFormat StringFormat = new StringFormat() { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center }; RectangleF Rectangle = new RectangleF(cellBounds.X, cellBounds.Y, cellBounds.Width, cellBounds.Height); if (percentage >= 0.0) { // Draw the progress bar and the text 绘制进度条和文本 g.FillRectangle(new SolidBrush(Color.FromArgb(255, 189, 242)), cellBounds.X + 2, cellBounds.Y + 2, Convert.ToInt32((percentage * cellBounds.Width - 4)), cellBounds.Height - 4); g.DrawString(progressVal.ToString() + "%", cellStyle.Font, foreColorBrush, Rectangle, StringFormat); } else { // draw the text 绘制文本 if (this.DataGridView.CurrentRow.Index == rowIndex) g.DrawString(progressVal.ToString("#0.0") + "%", cellStyle.Font, new SolidBrush(cellStyle.SelectionForeColor), Rectangle, StringFormat); else g.DrawString(progressVal.ToString("#0.0") + "%", cellStyle.Font, foreColorBrush, Rectangle, StringFormat); } } }