WPF点击登录按钮抛System.FormatException,点确定后窗口正常打开如何解决
System.FormatException异常修复方案
根因说明
你遇到的Input string was not in a correct format异常并非数据查询阶段抛出,而是employeeRank1List控件绑定DefaultView的UI渲染阶段抛出的:控件渲染每行数据时,尝试转换Id或Name字段的格式与绑定目标属性不匹配,或者存在脏数据不符合类型要求。异常被方法内的try-catch捕获后弹出提示,但UI渲染的容错机制会跳过错误项继续加载,因此关闭弹窗后窗口仍能正常显示。
修复步骤
第一步:优化查询语句,过滤/转换脏数据
不要使用select *全量查询,明确指定需要的字段并做格式兼容处理,避免NULL或非法格式数据进入绑定逻辑:// 示例:Id为空时默认填0,Name为空时默认填空字符串 string query = "SELECT ISNULL(Id, 0) AS Id, ISNULL(Name, '') AS Name FROM EmployeeRank1";如果Id字段存在非数字的脏数据,可以在SQL层直接过滤:
string query = "SELECT Id, Name FROM EmployeeRank1 WHERE ISNUMERIC(Id) = 1";第二步:调整属性赋值顺序
先给控件绑定数据源,再指定显示和值的绑定路径,避免控件未完全初始化时的绑定异常:// 调整后的顺序 employeeRank1List.ItemsSource = employeeRank1Table.DefaultView; employeeRank1List.DisplayMemberPath = "Name"; employeeRank1List.SelectedValuePath = "Id";第三步:调整方法触发时机
确认ShowEmployeeRank1方法的调用位置,必须放在窗口的InitializeComponent()执行完成之后,或者放在窗口的Loaded事件中触发,避免控件未初始化完成时调用导致异常。兜底排查方案
如果以上方法无效,可以在赋值数据源前遍历数据行,定位异常数据:foreach (DataRow row in employeeRank1Table.Rows) { Console.WriteLine($"Id值:{row["Id"]},类型:{row["Id"].GetType().Name}"); }找到格式非法的行后清理对应数据库数据即可。
内容的提问来源于stack exchange,提问作者zaimov
相关产品推荐
相关产品推荐

