【问题标题】:How to reset the item select on ListView winform如何重置ListView winform上的项目选择
【发布时间】:2020-07-03 03:42:23
【问题描述】:

我有一个小项目,我从 txt 中获取一些值并将其放入 ListView 中。当我单击某个项目时,我需要获取选定的值,这是我选择的第一个项目,工作正常,但如果我再次尝试选择,则会出现异常。

这就是我所做的..

Json = new StreamReader(openDialog.FileName).ReadToEnd();
                var ParsedValue = JsonValue.Parse(Json);
                Parsed = JsonConvert.DeserializeObject<List<Model>>(ParsedValue.ToString());
                foreach (var item in Parsed)
                {
                    var rows = new string[] { item.car, Convert.ToString(item.age )};
                    var items = new ListViewItem(rows)
                    {
                        Tag = item
                    };

                    ListViewCars.Items.Add(items);
                }

列表视图已填充。

并从列表中选择项目:

   private void cartsList_SelectedIndexChanged(object sender, EventArgs e)
    {
        ItemSelected = (Model)ListViewCars.SelectedItems[0].Tag;
    }

我只能在程序运行时获取我首先选择的值。

例外:

System.ArgumentOutOfRangeException:'InvalidArgument='0' 的值对'index' 无效。 参数名称:index'

【问题讨论】:

  • 我的猜测是因为您的 ListView 在您尝试访问索引 0 时为空。

标签: c# winforms


【解决方案1】:

查看ListView.SelectedIndexChanged 上的文档。具体来说,请查看 Remarks 部分,内容如下:

只要 ListViewItem 的 Selected 属性发生变化,SelectedIndices 集合就会发生变化。属性更改可以以编程方式发生,也可以在用户选择项目或清除对项目的选择时发生。 当用户选择一个项目而没有按 CTRL 来执行多选时,控件首先会清除之前的选择。在这种情况下,此事件会为之前选择的每个项目发生一次,为新选择的项目发生一次。

我添加了重点。这意味着当您选择第二个项目时,当前选定的项目将被取消选择,并且SelectedIndexChanged 会在新项目被选中之前触发。因此,当您尝试使用ListViewCars.SelectedItems[0].Tag 获取第一个选定项目时,您会得到ArgumentOutOfRangeException,因为没有选定项目。

您需要在事件处理程序的顶部添加一个检查,以确保在访问 SelectedItems[0] 之前至少有一个选定项。

【讨论】:

  • 我得到了这个概念,当我在调试时,我第二次点击一个项目它归零,但列表视图已满。如何解决?如果事件被触发,是因为我点击了一个项目
  • 列表视图已满,但您没有任何选择的项目,因为您选择的第一个项目在选择第二个项目之前未选择。正如我所说,您需要确保SelectedItems 在访问项目之前有项目。 if (SelectedItems.Count &gt; 0),例如。当没有选定的项目时,您必须自己决定做什么。或许将ItemSelected 设置为null
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多