我有一个定义了五列的DataGridView。用户通过openFileDialog选择一个或多个文件,在运行时填充DataGridView,并将文件名加载到DataGridView的第一列。第二列和第三列包含复选框,用于指示应如何处理文件名。 true值为1,false为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;
}
}
}
}
答案 0 :(得分:0)
解决方案是不使用CellValueChanged事件,而是使用CellClick事件。我在这里找到了这个指导:https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcheckboxcell(v=vs.110).aspx它指出了什么&#34;如果你想在用户单击复选框单元格时立即响应,你可以处理DataGridView.CellClick事件,但是这个事件发生在单元格值之前更新。如果您在点击时需要新值,则一个选项是根据当前值计算预期值。&#34;因此,如果用户单击选中的复选框(= 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;
}
}
}
}
答案 1 :(得分:-1)
您可以参考此link来了解如何对多个选择进行操作。这是多个选择删除。 这可能对您的问题有所帮助。