繁体   English   中英

如何仅在DataGridView中选中两个DataGridViewCheckBox列之一或为true

[英]How to have only one of two DataGridViewCheckBox columns checked or true in a DataGridView

我有一个定义了五列的DataGridView。 用户通过运行时通过openFileDialog选择一个或多个文件来填充DataGridView,并将文件名加载到DataGridView的第一列中。 第二和第三列包含用于指示应如何处理文件名的复选框。 真值为1,假值为0。但是,用户只需要为每个文件名选择两个复选框之一。 如果用户选中其中一个复选框,则我希望另一个复选框(如果已选中)变为未选中状态。 这是下面的代码。 它不会产生任何错误,并且当偶尔使一个复选框处于未选中状态时被取消选中时,它可能会取消选中同一列或另一列中的另一个复选框,但永远不会在同一行中。 我需要学习使用调试器,并且在陷入困境时现在可以进行调试,但是同时我也希望能收到以下任何帮助:

private void dataGridViewInputReports_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0 && e.ColumnIndex > 0 && e.ColumnIndex < 3)
    {
        if (Convert.ToInt16(dataGridViewInputReports.Rows[e.RowIndex].Cells[e.ColumnIndex].Value) == 1)
        {
            if (e.ColumnIndex == 1)
            {
                dataGridViewInputReports.Rows[e.RowIndex].Cells[2].Value = 0;
            }
            else if (e.ColumnIndex == 2)
            {
                dataGridViewInputReports.Rows[e.RowIndex].Cells[1].Value = 0;
            }
        }
    }
}

解决方案是不使用CellValueChanged事件,而是使用CellClick事件。 我在这里找到了该指南: https : //msdn.microsoft.com/zh-cn/library/system.windows.forms.datagridviewcheckboxcell(v=vs.110).aspx ,其中指出“如果您想在用户单击复选框单元格,可以处理DataGridView.CellClick事件,但是此事件在更新单元格值之前发生。如果单击时需要新值,则一种方法是计算期望值根据当前值。” 因此,如果用户单击已选中的复选框(= 1),我必须编写代码,知道该复选框的值将变为未选中(= 0),但目前仍处于选中状态(= 1)。 此代码将切换在同一dataGridView行中选中两个复选框中的哪个复选框:

private void dataGridViewInputFiles_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.RowIndex >= 0 && e.ColumnIndex == 1 || e.ColumnIndex == 2)
    {
        if (Convert.ToInt16(dataGridViewInputFiles.Rows[e.RowIndex].Cells[e.ColumnIndex].Value) == 0)
        {
            if (e.ColumnIndex == 1)
            {
                dataGridViewInputFiles.Rows[e.RowIndex].Cells[2].Value = 0;
            }
            else if (e.ColumnIndex == 2)
            {
                dataGridViewInputFiles.Rows[e.RowIndex].Cells[1].Value = 0;
            }
        }
        else
        {
            if (e.ColumnIndex == 1)
            {
                dataGridViewInputFiles.Rows[e.RowIndex].Cells[2].Value = 1;
            }
            else if (e.ColumnIndex == 2)
            {
                dataGridViewInputFiles.Rows[e.RowIndex].Cells[1].Value = 1;
            }
        }
    }
}

您可以参考此链接以了解如何对多个选择进行操作。 这是用于删除的多个选择。 这可能对您的问题有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM