C# WinForm中DataGridView全选复选框后单选行报错解决方案
解决DataGridView复选列全选后单选类型转换错误问题
问题核心是你设置了复选列的TrueValue=1、FalseValue=0,但全选按钮代码直接给单元格赋值布尔值,和手动单选时的1/0类型不一致,导致后续判断出错。以下是两种直接的解决方式:
方式一:统一全选时的值类型(和列定义保持一致)
修改全选按钮的代码,不再使用布尔值,而是复用列定义的TrueValue和FalseValue,确保手动选择和批量选择的值类型完全统一:
private void btnSelectALl_Click(object sender, EventArgs e) { if (DG_Joint.Rows.Count <= 0) return; // 获取复选列的配置值 var checkColumn = DG_Joint.Columns["Select"] as DataGridViewCheckBoxColumn; if (checkColumn == null) return; // 判断当前是否处于全选状态,决定要切换的目标值 bool isAllChecked = DG_Joint.Rows.Cast<DataGridViewRow>() .All(row => Convert.ToBoolean(row.Cells["Select"].Value)); foreach (DataGridViewRow row in DG_Joint.Rows) { DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)row.Cells["Select"]; chk.Value = isAllChecked ? checkColumn.FalseValue : checkColumn.TrueValue; } }
方式二:优化选中状态判断逻辑(兼容多种值类型)
不管单元格值是布尔值还是1/0,直接使用单元格的Checked属性判断选中状态——这个属性已经封装了对TrueValue/FalseValue的解析逻辑,完全不用关心底层值的类型:
List<int> JointList = new(); foreach (DataGridViewRow? row in DG_Joint.Rows) { if (row.Cells["Select"] is DataGridViewCheckBoxCell chk) { // 直接用Checked属性判断,无需手动解析Value if (chk.Checked) { if (int.TryParse(row.Cells["JointID"].Value?.ToString(), out int jointId)) { JointList.Add(jointId); } } } }
如果不想用Checked属性,也可以用Convert.ToBoolean()统一转换值类型,兼容布尔、整数、字符串等多种格式:
bool isChecked = Convert.ToBoolean(chk.Value); if (isChecked) { // 后续逻辑... }
内容的提问来源于stack exchange,提问作者fery
相关产品推荐
相关产品推荐

