1

再次被这个 listview 对象迷惑了。当我尝试从 Windows 表单中的列表视图中检索选定的列表视图项时,我的代码会出现“下标越界”错误。使用 VS add watch 命令,我看到以下内容当我查看 listview 对象的手表时,我看到以下内容

this.SearchResults  {System.Windows.Forms.ListView, Items.Count: 52, Items[0]: ListViewItem: {0}}   System.Windows.Forms.ListView

所以我看到 52 的计数是正确的,当程序运行时,我可以从集合中选择一行。例如,假设我从集合中挑选了第 5 个项目。手表将返回以下内容

this.SearchResults.SelectedIndices[0]   5   int

因此,对于索引,我只想将 listviewitem 传递给另一个对象以进行进一步处理。当我尝试这个时,我得到一个运行时错误

An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.Forms.dll

Additional information: InvalidArgument=Value of '5' is not valid for 'index'.

这怎么可能?我有 52 个项目,代码的行为好像列表视图是空的。我曾尝试对索引进行硬编码,但这也不起作用。

我的此表单的构造函数代码列表视图如下

public ResultsDisplay(List<MATS_Doc> foundDocs)
    {
        InitializeComponent();

        this.CenterToScreen();
        this.SearchResults.Columns.Add("Title");
        this.SearchResults.Columns.Add("Stuff");
        foreach (MATS_Doc doc in foundDocs)
        {
            // retrieve coresponding document
            // create new ListViewItem
            ListViewItem searchResults = new ListViewItem(doc.Id.ToString());
            searchResults.SubItems.Add(doc.Title);
            searchResults.SubItems.Add(doc.Stuff);
            // add the listviewitem to a new row of the ListView control
            this.SearchResults.Items.Add(searchResults); //show Text1 in column1, Text2 in col2
        }
        foreach (ColumnHeader column in this.SearchResults.Columns)
        {
            column.Width = -2;
        }
        this.Show();
    }

更新

下面是引发异常的代码。列表视图的形式相同

 if (scoredListing == null)
        {
            DocumentView showdoc = new DocumentView(this.SearchResults.SelectedItems[this.SearchResults.SelectedIndices[0]]);
            showdoc.ShowDialog();
        }
4

3 回答 3

3
this.SearchResults.SelectedIndices[0]

每次没有选择时都会抛出,因为SelectedIndices它是空的,所以没有第一个元素。的价值是this.SearchResults.SelectedIndices.Count多少?您的索引必须介于 0 和该值 - 1 之间。

编辑:好的,在MSDN 文档中找到了这个:

当心从未显示的列表

如果您的 ListView 从未被绘制过(例如,它在 TabControl 中,在尚未被选中的选项卡中),则 Selected 属性不能被信任。在这种情况下,父 ListView 的 SelectedItems 和 SelectedIndices 未正确更新,仍将为空。

EDIT2:这很有趣但不相关。正如@nolonar 所指出的,SelectedIndices包含引用所有项目的索引,而不是选定的项目,因此值 5 不是指第五个选择项目(因为可能只有一个),而是总体上的第五个项目。

于 2013-04-10T14:38:51.070 回答
2

问题在于:

this.SearchResults.SelectedItems[this.SearchResults.SelectedIndices[0]]

应该是这样的:

this.SearchResults.Items[this.SearchResults.SelectedIndices[0]]

如果您只选择了 1 个项目,SelectedItems将只保留 1 个元素,并且如果您尝试访问除0

于 2013-04-10T14:57:48.907 回答
2

你可能需要使用

this.SearchResults.Items[4]

选择第 5 项。

当您使用SelectedItems列表时,它只返回选定的项目。在选定的项目集合中,当您调用它时,第 5 项可能不存在。因为可能没有任何选择,或者只能选择一项。

于 2013-04-10T14:40:34.600 回答