将数据网格视图按钮单元格设为只读

本文关键字:单元格 只读 按钮 视图 数据 数据网 网格 | 更新日期: 2023-09-27 17:57:19

获取错误:

无法将类型"bool"转换为 'System.Windows.Forms.DataGridViewButtonColumn

对于行:

(DataGridViewButtonColumn)row.Cells["Recall"].ReadOnly = true;

任何想法,请

将数据网格视图按钮单元格设为只读

这里有关于

如何禁用DataGridViewButtonCellDataGridViewButtonColumn的提示 这里和这里.

然而,我

不确定我有多喜欢他们:很多工作却收效甚微,afaics..

首先,无论如何,DataGridViewButtonCell都不是真正的Button。它被渲染为Button,但这实际上只是视觉效果。

这与任何其他单元格类型不同:在 TextCell 中,覆盖了一个真实的TextBox,对于 ComboBoxCell 或 CheckBoxCells,同样显示了真实的ComboBox和真实的CheckBox控件,可以在EditingControlShowing事件中抓取和操作这些控件。您甚至可以向这些控件添加事件处理程序。

对于ButtonCell来说并非如此。在这里,您需要对CellClickCellContentClick事件进行编码,例如查询e.ColumIndex值以确定列,通常还需要确定单击的单元格的e.RowIndex

因此,功能禁用无论如何都会涉及此代码。下面是一个使用 ReadOnly 属性的示例,该属性本身不会在 ButtonCell 中执行任何操作:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    DataGridViewCell cell = dataGridView1[e.ColumnIndex, e.RowIndex];
    if (cell.OwningColumn.CellType == typeof(DataGridViewButtonCell) 
    && cell.ReadOnly) Console.Write("This Cell is Disabled");
}

设置它的语法是针对 sinlge 单元格或整个列:

   ((DataGridViewButtonCell)dataGridView1[1, 1]).ReadOnly = true;
   dataGridView1.Columns[1].ReadOnly = true;

请注意,将整设置为 ReadOnly 后,您无法将单个Button设置回 ReadOnly = false


您可以通过设置ForeColor直观地指示禁用状态:

对于一个单元格:

((DataGridViewButtonCell) dataGridView1[1, 1]).Style.ForeColor = 
                                               SystemColors.InativeCaption;

或者对于整个列:

   ((DataGridViewButtonColumn) dataGridView1.Columns[1]).DefaultCellStyle.BackColor =
                                                         SystemColors.InactiveCaption;

要使这些工作,您需要将按钮的外观设置为Flat,例如:

 ((DataGridViewButtonColumn)dataGridView1.Columns[1]).FlatStyle = FlatStyle.Flat;

试试这个,

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
    {           
     var dgv = (DataGridView)sender;                    
    if (dgv.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
    {    
    dgv.Rows[e.RowIndex].Cells["Recall"].ReadOnly = true;   
    }    
    }