【问题标题】:C# Make other button column cell unclickable when one of the cell is clickedC# 当单击其中一个单元格时,使其他按钮列单元格不可点击
【发布时间】:2022-01-22 14:20:18
【问题描述】:

我有一个带有按钮列的 datagridview 的 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;
             }                                   
        }

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

【问题讨论】:

  • 类似:foreach (var cell in senderGrid.Rows.OfType<DataGridViewRow>().SelectMany(x => x.Cells.OfType<DataGridViewDisableButtonCell>())) cell.Enabled = false;。假设您有一个该自定义类型的列。否则在SelectMany 范围内附加where 子句以指定哪个OwningColumn
  • @dr.null 非常感谢这个例子。问题已解决。
  • @dr.null - 请张贴作为 OP 可以接受的答案。
  • @Enigmativity 当然。抱歉,我发表了评论,因为我没有检查代码。只是为了暗示这个想法。
  • @dr.null - 如果他们接受了答案,那么问题在此站点上会更有价值。 cmets 中的答案并不重要。感谢您添加它。

标签: c# winforms


【解决方案1】:

您需要获取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);
    }
}

【讨论】: