C# 在单击其中一个单元格时使其他按钮列单元格不可单击

C# Make other button column cell unclickable when one of the cell is clicked

我有一个 GUI,它有一个带有按钮列的数据网格视图。

单击按钮单元格后,我将按钮 enabled 属性 设置为 false。

        private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {                 
            DataGridView senderGrid = (DataGridView)sender;
            if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
            {
                //....
               DataGridViewDisableButtonCell btnClick = (DataGridViewDisableButtonCell)dataGridView4.Rows[e.RowIndex].Cells[e.ColumnIndex];
               btnClick.Enabled = false;
        
               //execude code
        
               btnClick.Enabled = true;
             }                                   
        }

我的问题是如何使另一个单元格也不可点击,以防止在单击其中一个按钮单元格时出现代码 运行?

您需要获取 DataGridViewDisableButtonCell 类型的单元格才能获取或设置它们的属性。为避免重复相同的代码,创建一个方法来切换 Enabled 属性.

private void SetEnabled(bool enabled)
{
    foreach (var cell in senderGrid.Rows.OfType<DataGridViewRow>()
        .SelectMany(x => x.Cells
        .OfType<DataGridViewDisableButtonCell>())) 
        cell.Enabled = enabled;
}

如果您有多个该类型的列并且您想要将更改应用于特定的列,那么您需要指定目标列:

private void SetEnabled(bool enabled, int columnIndex)
{
    foreach (var cell in senderGrid.Rows.OfType<DataGridViewRow>()
        .SelectMany(c => c.Cells
        .OfType<DataGridViewDisableButtonCell>()
        .Where(col => col.OwningColumn.Index == columnIndex)))
        cell.Enabled = enabled;
}

使用代码中的方法:

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    var senderGrid = sender as DataGridView;

    if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn && e.RowIndex >= 0)
    {
        SetEnabled(false);
        // Or
        // SetEnabled(false, e.ColumnIndex);

        //execude code

        SetEnabled(true);
        // Or
        // SetEnabled(true, e.ColumnIndex);
    }
}