標籤:
轉自:https://msdn.microsoft.com/zh-cn/library/ms171619(v=vs.110).aspx
DataGridView 控制項包括 DataGridViewButtonCell 類,其用於顯示具有與按鈕類似的使用者介面 (UI) 的儲存格。 但是,DataGridViewButtonCell 不提供禁用儲存格所顯示按鈕外觀的方法。
以下程式碼範例示範如何自訂 DataGridViewButtonCell 類以顯示可以顯示為禁用的按鈕。 此樣本定義了一個新的儲存格類型,即從 DataGridViewButtonCell 派生的 DataGridViewDisableButtonCell。 此儲存格類型提供了一種新 Enabled 屬性,可設定為 false 以拖動儲存格中已禁用的按鈕。 此樣本還定義了一個新的列類型,即顯示 DataGridViewDisableButtonCell 對象的DataGridViewDisableButtonColumn。 為了示範此新儲存格和列類型,父級 DataGridView 中的每個DataGridViewCheckBoxCell 的當前值確定了相同行中 DataGridViewDisableButtonCell 的 Enabled 屬性是否是 true 或false。
| 注意 |
當從 DataGridViewCell 或 DataGridViewColumn 進行派生並將新屬性添加到派生的類時,請確保重寫 Clone 方法以在複製操作過程中複製新屬性。 還應調用基類的 Clone 方法,以便將基類的屬性複製到新的儲存格或列。 |
樣本C#VB
using System;using System.Drawing;using System.Windows.Forms;using System.Windows.Forms.VisualStyles;class Form1 : Form{ private DataGridView dataGridView1 = new DataGridView(); [STAThread] public static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } public Form1() { this.AutoSize = true; this.Load += new EventHandler(Form1_Load); } public void Form1_Load(object sender, EventArgs e) { DataGridViewCheckBoxColumn column0 = new DataGridViewCheckBoxColumn(); DataGridViewDisableButtonColumn column1 = new DataGridViewDisableButtonColumn(); column0.Name = "CheckBoxes"; column1.Name = "Buttons"; dataGridView1.Columns.Add(column0); dataGridView1.Columns.Add(column1); dataGridView1.RowCount = 8; dataGridView1.AutoSize = true; dataGridView1.AllowUserToAddRows = false; dataGridView1.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter; // Set the text for each button. for (int i = 0; i < dataGridView1.RowCount; i++) { dataGridView1.Rows[i].Cells["Buttons"].Value = "Button " + i.ToString(); } dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged); dataGridView1.CurrentCellDirtyStateChanged += new EventHandler(dataGridView1_CurrentCellDirtyStateChanged); dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick); this.Controls.Add(dataGridView1); } // This event handler manually raises the CellValueChanged event // by calling the CommitEdit method. void dataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (dataGridView1.IsCurrentCellDirty) { dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); } } // If a check box cell is clicked, this event handler disables // or enables the button in the same row as the clicked cell. public void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if (dataGridView1.Columns[e.ColumnIndex].Name == "CheckBoxes") { DataGridViewDisableButtonCell buttonCell = (DataGridViewDisableButtonCell)dataGridView1. Rows[e.RowIndex].Cells["Buttons"]; DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)dataGridView1. Rows[e.RowIndex].Cells["CheckBoxes"]; buttonCell.Enabled = !(Boolean)checkCell.Value; dataGridView1.Invalidate(); } } // If the user clicks on an enabled button cell, this event handler // reports that the button is enabled. void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { if (dataGridView1.Columns[e.ColumnIndex].Name == "Buttons") { DataGridViewDisableButtonCell buttonCell = (DataGridViewDisableButtonCell)dataGridView1. Rows[e.RowIndex].Cells["Buttons"]; if (buttonCell.Enabled) { MessageBox.Show(dataGridView1.Rows[e.RowIndex]. Cells[e.ColumnIndex].Value.ToString() + " is enabled"); } } }}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; } } // Override the Clone method so that the Enabled property is copied. public override object Clone() { DataGridViewDisableButtonCell cell = (DataGridViewDisableButtonCell)base.Clone(); cell.Enabled = this.Enabled; return cell; } // By default, enable the button 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) { // The button cell is disabled, so paint the border, // background, and disabled button for the cell. if (!this.enabledValue) { // Draw the cell background, if specified. if ((paintParts & DataGridViewPaintParts.Background) == DataGridViewPaintParts.Background) { SolidBrush cellBackground = new SolidBrush(cellStyle.BackColor); graphics.FillRectangle(cellBackground, cellBounds); cellBackground.Dispose(); } // Draw the cell borders, if specified. if ((paintParts & DataGridViewPaintParts.Border) == DataGridViewPaintParts.Border) { PaintBorder(graphics, clipBounds, cellBounds, cellStyle, advancedBorderStyle); } // Calculate the area in which to draw the button. Rectangle buttonArea = cellBounds; Rectangle buttonAdjustment = this.BorderWidths(advancedBorderStyle); buttonArea.X += buttonAdjustment.X; buttonArea.Y += buttonAdjustment.Y; buttonArea.Height -= buttonAdjustment.Height; buttonArea.Width -= buttonAdjustment.Width; // Draw the disabled button. ButtonRenderer.DrawButton(graphics, buttonArea, PushButtonState.Disabled); // Draw the disabled button text. if (this.FormattedValue is String) { TextRenderer.DrawText(graphics, (string)this.FormattedValue, this.DataGridView.Font, buttonArea, SystemColors.GrayText); } } else { // The button cell is enabled, so let the base class // handle the painting. base.Paint(graphics, clipBounds, cellBounds, rowIndex, elementState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts); } }}
如何:禁用 Windows 表單 DataGridView 控制項的按鈕列中的按鈕