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

时间:2013-09-04 14:34:36

标签: c# winforms datagridview

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

请在下面找到我的dataGridView,

enter image description here

我想要做的是在运行时名称单元格为空时禁用复选框。

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

修改

我尝试过这样的事情,

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();
        }
}

4 个答案:

答案 0 :(得分:8)

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

  • columnIndex属性,因此您可以测试是否对 name 列(索引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;
        }
    }
}

修改

正如其他人所说,为了对新添加的行禁用checkbox(特别是如果AllowUserToAddRow属性设置为true),您可以处理{{1 event:

RowAdded

答案 1 :(得分:3)

您可以使用DataGridView.CellValueChanged事件:

 private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.RowIndex >= 0)
        {
            if (e.ColumnIndex == 1 && dataGridView1[1, e.RowIndex].Value.ToString() != "")
                dataGridView1[2, e.RowIndex].ReadOnly = false;
            else
                dataGridView1[2, e.RowIndex].ReadOnly = true;
        }
    }

但是为了让复选框首先处于禁用状态,请确保使用设计器将列设置为ReadOnly,并且在DataGridView.RowsAdded事件中,为新创建的行设置checkbox属性ReadOnly = true: / p>

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        dataGridView1[2, e.RowIndex].ReadOnly = true;
    }

答案 2 :(得分:3)

相当旧的帖子,但我认为您可以使用CellBeginEdit事件并根据您的情况取消事件。它不是禁用列,而是取消编辑所需的列值。

1)订阅活动:

this.dataGridView1.CellBeginEdit  += DataGridView1OnCellBeginEdit;

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);
    }

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

这意味着三列中只有一列("无","读","全")可以是" true"

enter image description here

答案 3 :(得分:1)

简单,在Visual Studio中有内置的只读属性,将其标记为true