轉自:http://saisen.blog.hexun.com/58985383_d.html
本人在程式開發中使用DataGridView控制項的DataGridViewButtonColumn列類型時,想控制DataGridViewButtonColumn的某一行按鈕不可用或不可點即常規Button按鈕Enabled屬性設定為false的狀態,卻發現DataGridViewButtonColumn沒有Enabled屬性,非常的著急和痛苦。經過查閱大量的網上資料和書籍,終於解決了這一問題。先分享給大家,轉載請註明出處。。。
共分為兩步:
首先,將以下代碼(自訂的兩個類)粘貼到你的項目中
//自訂DataGridViewDisableButtonColumn列按鈕類型
public class DataGridViewDisableButtonColumn : DataGridViewButtonColumn { public DataGridViewDisableButtonColumn() { this.CellTemplate = new DataGridViewDisableButtonCell(); } } public class DataGridViewDisableButtonCell : DataGridViewButtonCell { private bool enabledValue; public bool Enabled { get { return enabledValue; } set { enabledValue = value; } } public override object Clone() { DataGridViewDisableButtonCell cell = (DataGridViewDisableButtonCell)base.Clone(); cell.Enabled = this.Enabled; return cell; } public DataGridViewDisableButtonCell() { this.enabledValue = true; } protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, DataGridViewElementStates elementState, object value, object formattedValue, string errorText, DataGridViewCellStyle cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts) { if (!this.enabledValue) { if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background) { SolidBrush cellBackground = new SolidBrush(cellStyle.BackColor); graphics.FillRectangle(cellBackground, cellBounds); cellBackground.Dispose(); } if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border) { PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); } Rectangle buttonArea = cellBounds; Rectangle buttonAdjustment = this.BorderWidths(advancedBorderStyle); buttonArea.X += buttonAdjustment.X; buttonArea.Y += buttonAdjustment.Y; buttonArea.Height -= buttonAdjustment.Height; buttonArea.Width -= buttonAdjustment.Width; ButtonRenderer.DrawButton(graphics, buttonArea, System.Windows.Forms.VisualStyles.PushButtonState.Disabled); if (this.FormattedValue is String) { TextRenderer.DrawText(graphics, (string)this.FormattedValue, this.DataGridView.Font, buttonArea, SystemColors.GrayText); } } else { base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts); } } }
//結束
然後,在你使用DataGridView控制項時,通過下面方法新增列按鈕,此時的列按鈕中就有了Enabled屬性,通過設定該屬性就可以讓DataGridView控制項中的按鈕禁用或不可用(即不能點擊)。
//
DataGridViewDisableButtonColumn co7= new DataGridViewDisableButtonColumn();
co7.HeaderText = "按鈕";
dataGridView1.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { co7 });