再次被这个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();
}
答案 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
以外的索引