C# 如何:禁用 Windows 窗体 DataGridView 控件的按钮列中的按钮 Enable = false

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

posted @ 2009-07-12 21:45  afish1984  阅读(1818)  评论(0编辑  收藏  举报