如何根据其他单元格中的值禁用(只读)DataGridView CheckBox列中的单元格?

Jak*_*ake 9 c# datagridview winforms

我发现了许多类似的问题和答案,但没有人帮助我解决我的问题.

请在下面找到我的dataGridView,

在此输入图像描述

我想要做的是如果名称单元格在运行时为空,则禁用复选框.

我尝试了可能的方法,但在我检查后,单元格一直被禁用(只读).

编辑

我试过这样的事,

private void sendDGV_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (sendDGV.CurrentRow.Cells[1].Value != null)
        {
            sendDGV.CurrentRow.Cells[2].ReadOnly = false;
            sendDGV.Update();
        }
        else 
        {
            sendDGV.CurrentRow.Cells[2].ReadOnly = true;
            sendDGV.Update();
        }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 8

要处理列名称的更改,您可以使用该DataGridView.CellValueChanged事件.该e参数可让您访问:

  • columnIndex属性,因此您可以测试是否对名称列(索引1)进行了更改.
  • rowIndex属性,因此您检索相关的行并更改所需的值.

private void DataGridView1_CellValueChanged(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
{
    //second column
    if (e.ColumnIndex == 1) {
        object value = DataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
        if (value != null && value.ToString() != string.Empty) {
            DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = false;
        } else {
            DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

正如其他人所说,为了checkbox让新添加的行具有禁用状态(特别是如果AllowUserToAddRow属性设置为true),您可以处理该RowAdded事件:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = true;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

很旧的线程,但我认为您可以使用CellBeginEdit事件并根据您的条件取消该事件。它不是禁用列,而是取消编辑所需的列值。

1) 订阅事件:

this.dataGridView1.CellBeginEdit  += DataGridView1OnCellBeginEdit;
Run Code Online (Sandbox Code Playgroud)

2) 事件处理程序:

        private void DataGridView1OnCellBeginEdit(object sender, DataGridViewCellCancelEventArgs args)
    {
        var isTicked = this.dataGridView1.Rows[args.RowIndex].Cells[args.ColumnIndex].Value;

        args.Cancel = (isTicked is bool) && ((bool)isTicked);
    }
Run Code Online (Sandbox Code Playgroud)

我已经使用该事件获得了一个包容性复选框。

这意味着三列中只有一列(“无”,“读取”,“完整”)可以是“真”

在此处输入图片说明