ListView.SelectedIndexCollection lvsic;
lvsic = this.listView.SelectedIndices;
lock (this)
{
    lvsic = this.listView.SelectedIndices;
    ...
}上面是一段放在自定义控件类里面的代码,this代表用户控件,listView是这个控件里面的一个ListView。
请问各位大虾:
为什么两个相同的语句lvsic = this.listView.SelectedIndices;得到的结果却不同呢?
第一次执行后lvsic的IndicesArray的长度为1,
第二次执行后lvsic的IndicesArray的长度为0。很奇怪吧,是不是.Net 2003的一个bug呢?//////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////
MSDN中对SelectedIndices的注释:
ListView.SelectedIndices 属性 
获取控件中选定项的索引。
[C#]
public ListView.SelectedIndexCollection SelectedIndices {get;}属性值
ListView.SelectedIndexCollection,包含选定的项的索引。如果当前没有选定的项,则返回空 ListView.SelectedIndexCollection。备注
当 MultiSelect 属性设置为 true 时,此属性返回一个集合,该集合包含 ListView 中的所有选定项的索引。对于单项选择 ListView,此属性返回一个包含单个元素的集合,该元素包含 ListView 中唯一选定的项的索引。有关可以对集合中的项执行的任务的更多信息,请参见 ListView.SelectedIndexCollection。如果您要获取 ListView 控件中选定的项的集合,而不是选定项的索引位置,请使用 SelectedItems 属性。

解决方案 »

  1.   

    会不会是在第二三两句之间,SelectedIndices被修改了呢?
    但是我每次调试都是这个结果,如果运行的话,后面有条调用SelectedIndices[0]的语句就会报错。
      

  2.   

    不对,SelectedIndices是在lock语句执行后被修改的。
      

  3.   

    selectedindices如果是listview空间的selectindeceschange事件里的话就不足为奇。
    每次change时都回激发2次selelctindiceschanged事件
      

  4.   

    知道怎么解决了:
    Object obj = new Object();
    ...
    ListView.SelectedIndexCollection lvsic;
    lvsic = this.listView.SelectedIndices;
    lock (obj)
    {
    lvsic = this.listView.SelectedIndices;
    ...
    }这样写两次lvsic的值就是一样的了。
    有兴趣的可以看看.Net2005对lock的注释。