如何:禁用 Windows 表單 DataGridView 控制項的按鈕列中的按鈕

來源:互聯網
上載者:User

標籤:

轉自: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 控制項的按鈕列中的按鈕

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.