[英]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.