You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:08:35