Q1.  如何使单元格不可编辑?

A:设置 ReadOnly 属性,可以设置的对象包括 DataGridViewRow(行)、DataGridViewColumn(列)、DataGridViewCell(单元格)以及自身 DataGridView 对象均可设置 ReadOnly 属性来限制单元格的编辑状态。

扩展:需要注意的是,当 DataGridView 通过 DataSource 绑定数据自动生成行列时,如果直接在 Form 的构造函数初始化界面 InitializeComponent 后直接设置 ReadOnly 属性,会造成一些意想不到的效果……

  1 public MainForm()
  2 {
  3     InitializeComponent()
  4 
  5     Application.DoEvents()
  6     dataGridView.DataSource = Person.GetPersons()
  7     dataGridView[0, 0].ReadOnly = true
  8     dataGridView.Rows[2].ReadOnly = true
  9     dataGridView.Columns[1].ReadOnly = true
 10 } 

此时对 DataGridViewCell、DataGridViewRow的ReadOnly 设置无效,而对 DataGridViewColumn 的 ReadOnly 设置有效。

另外,ReadOnly 属性只是限制用户在界面上对单元格内容编辑的限制,并不影响在编程代码中对该单元格的编辑以及删除行列操作。

当然,你也可以在 CellBeginEdit 事件中对单元格进行判断,然后直接结束编辑即可,如下:

  1 dataGridView.CellBeginEdit += (sender, e) =>
  2 {
  3     if (e.RowIndex == 0 && e.ColumnIndex == 0)
  4     {
  5         e.Cancel = true
  6         // 或者
  7         // dataGridView.EndEdit();
  8     }
  9 }

Q2.  如何禁用单元格(Disable)?

A:DataGridView 不支持设置单元格的不可用状态,所以采用折中办法,使该“禁用”单元格的选中状态和其背景颜色相同,给人暗示性的外观提示该单元格“禁用”。

有一种便捷的方式,就是将该“禁用”单元格的选中颜色设置成非选中颜色,即如果未选中前是白底黑字,则将该“禁用”单元格的选中状态也改成白底黑字即可,对单元格、行和列均适用,举例如下:

  1 dataGridView[2, 2].Style.SelectionBackColor = Color.White
  2 dataGridView[2, 2].Style.SelectionForeColor = Color.Black
  3 
  4 dataGridView.Rows[1].DefaultCellStyle.SelectionBackColor = Color.White
  5 dataGridView.Rows[1].DefaultCellStyle.SelectionForeColor = Color.Black
  6 
  7 dataGridView.Columns[0].DefaultCellStyle.SelectionBackColor = Color.White
  8 dataGridView.Columns[0].DefaultCellStyle.SelectionForeColor = Color.Black

需要注意的是,同 Q1 中一样,在 InitializeComponent 方法后面直接操作,其中对单元格的设置无效,对行、列的设置有效!!

但是这种方法对文本内容的单元有效,对于 DataGridViewButtonColumn、DataGridViewCheckBoxColumn、DataGridViewComboBoxColumn 等其他特殊列就没效果了,毕竟对于特殊列,禁用单元格就是要禁用其中的特殊控件,这时候就需要重写其中的单元格模版了,以 DataGridViewButtonColumn 为例,代码如下:

public class DataGridViewButtonColumnExt : DataGridViewButtonColum
{
    public DataGridViewButtonColumnExt()
    {
        this.CellTemplate = new DataGridViewButtonCellExt()
    }
}

public class DataGridViewButtonCellExt : DataGridViewButtonCell
{
    private bool _Enabled;// 设置该单元格是否可用

    /// <summary>
    /// 单元格是否可用
    /// </summary>
    public bool Enabled
    {
        get
        {
            return _Enabled
        }
        set
        {
            _Enabled = value
        }
    }

    public override object Clone()
    {
        DataGridViewButtonCellExt cell =(DataGridViewButtonCellExt)base.Clone()
        cell.Enabled = this.Enabled

        return cell
    }

    public DataGridViewButtonCellExt()
    {
        this._Enabled = 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._Enabled)
        {
            // 绘制背景
            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 = cellBound
            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, 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)
        }
    }
}

View Code

相关文章:

  • 2021-10-25
  • 2021-11-05
  • 2021-12-07
  • 2021-07-21
  • 2022-01-16
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-07-18
  • 2022-02-15
  • 2021-07-08
  • 2022-12-23
  • 2021-06-24
相关资源
相似解决方案