C# ListView SelectedIndexChanged事件无所选项目问题

C# ListView SelectedIndexChanged事件无所选项目问题,c#,winforms,listview,selectedindexchanged,C#,Winforms,Listview,Selectedindexchanged,我正在开发一个小型的C#3.5 WinForms应用程序,它将事件日志名称从服务器抓取到列表视图中。选择其中一个项目时,另一个listview将使用SelectedIndexChanged事件,通过抓取SelectedItems集合中第一个项目的文本属性,使用所选事件日志中的事件日志条目填充,如下所示 string logToGet = listView1.SelectedItems[0].Text; 这在第一次可以正常工作,但是从第一个listview第二次选择事件日志名称失败。发生的情况是

我正在开发一个小型的C#3.5 WinForms应用程序,它将事件日志名称从服务器抓取到列表视图中。选择其中一个项目时,另一个listview将使用SelectedIndexChanged事件,通过抓取SelectedItems集合中第一个项目的文本属性,使用所选事件日志中的事件日志条目填充,如下所示

string logToGet = listView1.SelectedItems[0].Text;
这在第一次可以正常工作,但是从第一个listview第二次选择事件日志名称失败。发生的情况是SelectedIndexChanged事件获取的SelectedItems集合为空,因此我获取ArgumentOutOfRangeException


我不知所措。你知道我做错了什么吗?或者有更好的方法吗?

是的,原因是当你选择另一个项目时,列表视图会在选择新项目之前取消选择SelectedItem,因此计数会从1变为0,然后再变为1。解决此问题的一种方法是,在尝试使用SelectedItems集合之前检查它是否包含项。你这样做很好,你只需要考虑到这一点

乙二醇


在尝试从SelectedItems集合中检索值之前,应检查其中是否包含值

比如:

if(listView1.SelectedItems.Count > 0)
   //Do your stuff here

选择新项目时,将首先取消选择上一个项目。快速检查代码:

if( listView1.SelectedItems.Count > 0)
{
 string logToGet = listView1.SelectedItems[0].Text;
}

这将忽略所选项目更改为无所选项目。

我遇到了这个问题,在花了太多时间后,我意识到问题是因为试图从另一个线程获取listView1.SelectedItems。它可能对其他线程有用。

我认为从不同线程访问控件将提供完全不同的
异常。
if( listView1.SelectedItems.Count > 0)
{
 string logToGet = listView1.SelectedItems[0].Text;
}