C#datagridview两个复选框列就像两个单选按钮

时间:2017-05-22 16:30:45

标签: c# checkbox datagridview

我正在使用c#开发一个应用程序我在datagridview中添加了两个复选框。我希望他们像两个单选按钮一样。如果选中第一个复选框,则会自动取消选中另一个复选框 我尝试了一些代码,但对我没用。

private void datagridSB_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 15)
        {

            if (Convert.ToBoolean(datagridSB.CurrentRow.Cells[15].Value)==true)
            {
                datagridSB.CurrentRow.Cells[17].Value = false;
                //uncheck the second checkbox
            }
            else if (Convert.ToBoolean(datagridSB.CurrentRow.Cells[15].Value)==false)
            {
                datagridSB.CurrentRow.Cells[17].Value = true;
                //check the second checkbox
            }
        }
        if (e.ColumnIndex == 17)
        {
            if (Convert.ToBoolean(datagridSB.CurrentRow.Cells[17].Value) == true)
            {
                datagridSB.CurrentRow.Cells[15].Value = false;
                //uncheck the first checkbox
            }
            else if (Convert.ToBoolean(datagridSB.CurrentRow.Cells[17].Value) == false)
            {
                datagridSB.CurrentRow.Cells[15].Value = true;
                //check the first checkbox 
            }
        }   
    }

我得到错误NullReferenceException未处理(对象引用未设置为对象的实例) 任何帮助,请

3 个答案:

答案 0 :(得分:1)

我无法相信我错过了它,秒......你正在转变为整个条件:

Convert.ToBoolean(datagridSB.CurrentRow.Cells[17].Value = true)  

将结束paren移动到值之后,并且在C#中== not“=”,所以:

Convert.ToBoolean(datagridSB.CurrentRow.Cells[17].Value) == true

您的代码正在设置值,并从集合中评估您的布尔值...

答案 1 :(得分:0)

我仍然不明白为什么你想要使用两个复选框时,似乎只需要一个。你可能遇到的问题是双重的。首先,使用CurrentRow的{​​{1}}属性是有风险的,它可能会返回意外的结果,我觉得这可能是问题之一。另一个问题是使用DataGridView事件来捕获用户更改其中一个复选框的时间。在选中复选框的某些情况下,此事件似乎返回false。由于这种奇怪的行为,我猜测CellValueChanged事件并不是你想要做的最好的事情。

要解决这两个问题,我建议您使用事件返回的CellValueChanged而不是RowIndex属性。此外,我们要更改的事件是CurrentRow事件。当用户单击单元格的内容时,将触发此事件。对于复选框单元格,这将将其值从已更改为未检查,反之亦然。在这里,我们只需要检查复选框是否已选中。如果选中它,则将另一个复选框设置为取消选中,反之亦然。

下面的代码演示了上面描述的内容。有一个CellContentClick有三列,最后两列是复选框。 {>> 1}}事件连接到单击单元格内容时捕获,然后我们只是检查单击的单元格是否在第1列或第2列中,然后相应地设置另一个复选框。我添加了DataGridView事件来调用CellContentClick事件,否则用户可以快速双击复选框而不给其他复选框设置时间,从而导致两个复选框具有相同的价值。

CellContentDoubleClick

希望这有帮助。

答案 2 :(得分:0)

    private void datagridSB_CellValueChanged(object sender, DataGridViewCellEventArgs e)
    {
        if (datagridSB.Columns[e.ColumnIndex].Name == "withCashSB")
        {
            DataGridViewCheckBoxCell buttonCell = (DataGridViewCheckBoxCell)datagridSB.Rows[e.RowIndex].Cells["withProCSB"];

            DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)datagridSB.Rows[e.RowIndex].Cells["withCashSB"];
            buttonCell.Value = !(Boolean)checkCell.Value;
            datagridSB.Invalidate();
        }
        else if (datagridSB.Columns[e.ColumnIndex].Name == "withProCSB")
        {
            DataGridViewCheckBoxCell buttonCell = (DataGridViewCheckBoxCell)datagridSB.Rows[e.RowIndex].Cells["withCashSB"];

            DataGridViewCheckBoxCell checkCell = (DataGridViewCheckBoxCell)datagridSB.Rows[e.RowIndex].Cells["withProCSB"];
            buttonCell.Value = !(Boolean)checkCell.Value;
            datagridSB.Invalidate();
        }
    }

    private void datagridSB_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
        if (datagridSB.IsCurrentCellDirty)
        {
            datagridSB.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
    }

这里有两个复选框就像两个单选按钮的答案..