C#listview count> 0但没有项目这怎么可能?

时间:2013-04-10 14:34:46

标签: c# listview runtime-error listviewitem

再次被这个listview对象困惑。当我尝试从Windows窗体中的列表视图中检索选定的listviewitem时,我的代码正在踢出“下标越界”错误。使用VS add watch命令我看到以下内容当我查看listview对象的监视时,我看到以下

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

所以我看到52的计数是正确的,当程序运行时,我可以从集合中选择一行。例如,我说从系列中选择第5项。 Watch将返回以下内容

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

3 个答案:

答案 0 :(得分:3)

this.SearchResults.SelectedIndices[0]
每次没有选择时都会抛出

,因为SelectedIndices为空,所以没有第一个元素。 this.SearchResults.SelectedIndices.Count的价值是多少?您的索引必须介于0和此值之间 - 1。

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

  

小心从未显示的列表

     

如果您的ListView从不存在,则无法信任Selected属性   已被绘制(例如,它在TabControl中,在没有的选项卡中   已被选中)。在那种情况下,SelectedItems和   父ListView的SelectedIndices未正确更新   仍然是空的。

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

答案 1 :(得分:2)

您可能需要使用

this.SearchResults.Items[4]

选择第5项。

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

答案 2 :(得分:2)

问题在于:

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

应该是这个:

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

如果您只选择了1个项目,SelectedItems只会包含1个元素,如果您尝试访问0以外的索引

,则会抛出异常