C#列表视图计数>;0但没有项目,这怎么可能呢

本文关键字:项目 怎么可能 视图 列表 gt | 更新日期: 2023-09-27 18:08:41

再次被这个列表视图对象所困扰。当我试图从windows窗体的列表视图中检索所选的列表视图项时,我的代码抛出了一个"下标越界"错误

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个项目,代码的行为就像列表视图是空的一样。我尝试过对索引进行硬编码,但也没有成功。

我为这个表单的构造函数编写的代码listview在下面

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();
        }

C#列表视图计数>;0但没有项目,这怎么可能呢

this.SearchResults.SelectedIndices[0]

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

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

注意从未显示的列表

如果您的ListView从未已绘制(例如,它在TabControl中,在尚未绘制的选项卡中尚未选择(。在这种情况下,SelectedItems和父ListView的SelectedIndices未正确更新,并且将仍然是空的。

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

问题在于:

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

应该是这样的:

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

如果您只选择了一个项目,如果您尝试访问0 以外的索引,SelectedItems将只包含一个元素,并将引发异常

您可能需要使用

this.SearchResults.Items[4]

选择第5项。

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