11

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

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

4 回答 4

9

要处理列名称的更改,您可以使用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;
        }
    }
}

编辑

正如其他人指出的那样,为了checkbox禁用新添加的行(特别是如果AllowUserToAddRow属性设置为true),您可以处理该RowAdded事件:

private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
{
    DataGridView1.Rows[e.RowIndex].Cells[2].ReadOnly = true;
}
于 2013-09-04T14:52:39.700 回答
6

相当老的线程,但我认为您可以使用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);
    }

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

这意味着只有三列中的一列(“None”、“Read”、“Full”)可以是“true”

在此处输入图像描述

于 2017-01-17T10:48:41.060 回答
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 事件中,为新创建的行设置复选框属性 ReadOnly = true:

    private void dataGridView1_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
    {
        dataGridView1[2, e.RowIndex].ReadOnly = true;
    }
于 2013-09-04T15:14:17.957 回答
-1

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

于 2015-07-15T11:47:59.980 回答