System.FormatException: "" 不能转换到 Boolean。
那阵子在收七亿批量远程管理工具(RdpManager)1.6.5 那个版本,弹出来的就是这个框。触发路径简单到我有点不好意思写:在经典界面(不是 Ribbon 那套)的连接列表里,点一下某个分组名想把它折叠起来,“咔”地弹一个红叉框,标题写着“DataGridView 默认错误”,框里就一行上面那句异常。
第一反应是绑定或者排序出了问题。那个列表按分组排过序,折叠逻辑我又刚动过,“折叠时索引错行、把某行类型搞乱了”是最自然的猜测。翻了半天,索引没问题,排序也没问题——而且这错误跟点哪一组没关系,每次都在“画”的那一瞬间冒出来。
后来把断点挪到 DataError 上才看明白。经典版列表最前面那列“勾选”是个复选框列(DataGridViewCheckBoxColumn)。折叠时要给分组插一行标题行,原来的写法是直接 Rows.Add("", ...),把空字符串顺着列定义塞了进去。复选框列拿到一个 "",格式化的时候要把它解析成 bool,"" 解析不了,当场抛 FormatException。
空串是从第一格进去的。那格在数据行里是复选框,在标题行里本来就该是什么都没有的文本。我脑子里一直把“标题行”和“数据行”当成同一张表的两行,忘了列是同一列:你往一个复选框格里塞字符串,它不看你塞的是空是实,先解析再说。
改法是三步,顺序不能反:先建一个空行,再把 colCheck 那一格换成文本格(DataGridViewTextBoxCell),最后才给名称列写值——空串从头到尾没碰过复选框格。顺手加了道兜底:DataError 事件里不再往外弹那个“默认错误”框,真出了别的事,也不该拿一个系统红框糊到用户脸上。
这些都在 v165-V14 那个包里,涉及 MainForm.cs 和 MainFormNew.cs——经典版和九宫格版都得改,因为标题行那格复选框两边都长了。
顺带收拾了一个更表面的毛病:工具栏上“批量连接”被按钮宽度挤成了“批量连”,后一个字直接切掉。量了一下把几个按钮重排:添加/编辑/删除/导出/导入/设置/关于 从 75 撑到 86,“检测” 85→100,“批量连接” 95→124,“九宫格” 88→92,间距从 4 收到 3。听着鸡毛蒜皮,可按钮上的字被切一半,用户一眼就看见。
回头看,这类 bug 的讨厌在于它不挑人:空字符串谁都会顺手写,Table 把标题行和数据行塞进同一列,也是 WinForms 里再正常不过的模型。真要说教训,就一句——给 DataGridView 拼“非数据行”的时候,别默认它跟数据行长得一样。这话是说给我自己听的。
想拿带这版修复的包,官网那个七亿批量远程管理工具下载页一直在。列表折叠这类界面活儿,在七亿批量远程管理工具里也不是头一回了(防火墙窗口里那个跑到窗口外头的控件)。
评论