C# ListView切换选择项时触发ArgumentOutOfRangeException错误求助
解决ListView SelectedIndexChanged事件中索引越界的问题
这个问题我之前做WinForms项目时也碰到过,核心原因是你没考虑到SelectedIndexChanged事件的触发场景——它不止在用户选中新项时触发:当用户点击ListView空白区域取消选中,或者切换选中项的瞬间(旧项取消、新项选中之前的中间状态),这个事件都会被触发,此时SelectedItems集合是空的,直接访问[0]自然就会抛出ArgumentOutOfRangeException。
修复代码
只需要在访问选中项之前先判断集合是否有元素,同时建议优化类型转换的容错性,避免格式错误导致崩溃:
private void ListInstruments_SelectedIndexChanged(object sender, EventArgs e) { // 先确认选中项集合非空,再进行后续操作 if (listInstruments.SelectedItems.Count > 0) { ListViewItem selection = listInstruments.SelectedItems[0]; if (selection != null) { string strSelection = selection.Name; // 使用TryParse替代Convert.ToDecimal,避免格式错误崩溃 if (decimal.TryParse(strSelection, out decimal instrumentId)) { SelectedInstrumentID = instrumentId; LoadSelectedInstrument(); } else { // 这里可以根据需求添加错误处理,比如提示用户或记录日志 MessageBox.Show("仪器ID格式无效,请检查ListViewItem的Name属性设置"); } } } // 可选:如果需要处理取消选中的场景,可以在这里添加逻辑 // else // { // SelectedInstrumentID = 0; // 或者设置为默认值/空值 // // 比如清空加载的记录、重置界面状态等 // } }
关键修改点说明
- 添加集合非空判断:
listInstruments.SelectedItems.Count > 0是最核心的修复,确保只有当确实有选中项时才访问索引0 - 优化类型转换:
decimal.TryParse会安全尝试转换,返回布尔值表示是否成功,比Convert.ToDecimal更健壮,避免因为Name属性不是有效decimal格式导致的程序崩溃 - 可选的取消选中处理:如果你的业务需要在用户取消选中时做一些操作(比如清空界面),可以在
else块中添加对应逻辑
内容的提问来源于stack exchange,提问作者Ray Delien
相关产品推荐
相关产品推荐

