在做俄罗斯方块的时候写了以下一段代码:


private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string strsel = this.listView1.SelectedItems[0].Text;
            for (int i = 0; i < strsel.Length; i++)
            {
                bArray[i / 5, i % 5] = (strsel[i] == '1') ? true : false;
            }
            this.label1.Invalidate();
         }


就是在右边的ListView中选中一行,就在左边还原为砖块图案。可是当我第一次选择一行时没有什么问题,当我第二次选择一行时就出现以下的错误:


未处理ArgumentOutOfRangeException


InvalidArgument=“0”的值对于“index”无效。
          參数名: index


上网查找说是要加一句推断


if(listView1.SelectedItems.Count > 0)


{


}


可是我不知道为什么要加这句推断。于是决定自己去寻找答案..........


经过多次測试,发现一个“秘密”。我新建了一个project,窗口中仅仅放了一个ListView,然后在SelectedIndexChanged事件中仅仅加了一句代码:


private void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
            int c=this.listView1.SelectedItems.Count;
           }

目的是想看一下c=this.listView1.SelectedItems.Count的变化情况,第一次选择一行的时候,c=1,第二次选择一行的时候,运行了两遍SelectedIndexChanged事件,第一遍c=0,第二遍c=1,错误的根源就在第一遍运行SelectedIndexChanged事件的过程中。


然后我又选择多行进行測试,比方3行,那么SelectedIndexChanged事件就运行了4遍,第一遍c=0,第二遍c=1,第三遍c=2,第四遍c=3。


从上面的測试我得出了下面结论:


当第二次选择一行的时候,他是先把前一次选中的那一行取消,取消之后选中的行数c=this.listView1.SelectedItems.Count就变为了0(这时SelectedItems中没有内容,而去引用它,当然会出错),然后再去选中我们要选中的行,此时c=this.listView1.SelectedItems.Count又变为了1,即选中了一行。选择多行的时候也是相似的,一个看似非常easy的过程事实是分多步进行的。这就是错误的根源所在,所以我们在引用SelectedItems的时候要先做一个推断,看SelectedItems.Count是否大于0。


不论什么错误都是有它的原因的,仅仅要我们坚持就一定可以找到错误的根源。

关于SelectedItems的问题的更多相关文章

  1. WPF Datagrid multiple selecteditems in MVVM

    I can assure you: SelectedItems is indeed bindable as a XAML CommandParameter After a lot of digging ...

  2. SelectedItems的用法讲解

    在做俄罗斯方块的时候写了下面一段代码: private void listView1_SelectedIndexChanged(object sender, EventArgs e)         ...

  3. PyQt(Python+Qt)学习随笔:QTableWidget的findItems和selectedItems搜索项和访问选中项方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 1.搜索项 在表格部件中,可以根据文本以及匹配模式来搜索满足条件的项,调用语法: list[QTab ...

  4. PyQt(Python+Qt)学习随笔:树型部件QTreeWidget中当前列currentColumn和选中项selectedItems访问方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 当前列访问方法 树型部件QTreeWidget的currentColumn()方法返回当前项中得到焦 ...

  5. PyQt(Python+Qt)学习随笔:QListWidget获取当前选中项的selectedItems方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QListWidget的selectedItems方法返回列表部件中所有选中项的一个列表,调用语法如 ...

  6. .NET平台和C#编程的总结

    第一章   简单认识.NET框架    (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...

  7. 深入.NET平台和C#编程总结大全

    对于初学者的你,等到你把这个看完之后就更清楚地认知.NET和C#编程了,好了废话不多说,开始吧!                                                     ...

  8. CloudNotes之桌面客户端篇:插件系统的实现

    [CloudNotes版本更新历史与各版本下载地址请点击此处] [CloudNotes中文系列文章汇总列表请点击此处] [查看CloudNotes源代码请点击此处] 有时候,同一个名词,针对不同的人群 ...

  9. 利用WCF的双工通讯实现一个简单的心跳监控系统

    何为心跳监控系统? 故名思义,就是监控某个或某些个程序的运行状态,就好比医院里面的心跳监视仪一样,能够随时显示病人的心跳情况. 心跳监控的目的是什么? 与医院里面的心跳监视仪目的类似,监控程序运行状态 ...

随机推荐

  1. MyReport报表引擎2.0.0.0新功能

    Web报表引擎:Web上的良好的打印解决方式,WinForm的打印预览体现,报表自己主动化,支持直接打印,页小计,统计,转成金额大写,一维码显示等功能,满足中国式报表的常见功能需求.Web报表编辑器: ...

  2. hadoop出现namenode running as process 18472. Stop it first.

    hadoop出现namenode running as process 18472. Stop it first.等等,类别似几个的出现. namenode running as process 32 ...

  3. BestCoder Round #16

    BestCoder Round #16 题目链接 这场挫掉了,3挂2,都是非常sb的错误 23333 QAQ A:每一个数字.左边个数乘上右边个数,就是能够组成的区间个数,然后乘的过程注意取模不然会爆 ...

  4. Chapter 2 User Authentication, Authorization, and Security(4):限制SA帐户管理权限

    原版的:http://blog.csdn.net/dba_huangzj/article/details/38817915,专题文件夹:http://blog.csdn.net/dba_huangzj ...

  5. 系列五AnkhSvn

    原文:系列五AnkhSvn AnkhSvn介绍 AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新.添加文件,而不用在命令行或资源管理器中提交.而且该插件属于开 ...

  6. Java线(一个):线程安全的和不安全

    当我们看JDK API什么时候,总是找一些类描述说:,线程安全或线程安全,例如StringBuilder在,么一句,"将StringBuilder 的实例用于多个线程是不安全的.假设须要这种 ...

  7. JUnit + Mockito 单元测试(二)(good)

    import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...

  8. 正则、grep、sed、awk

    每次用到正则都要蛋疼一下,索性总结一下在这里. 正则 正則表達式主要分为基础正则和扩展正则.注意,正则和一般命令行输入的命令的通配符不同.正则仅仅使用于支持这样的表示法的工具,如:vi,grep,se ...

  9. [Oracle] 分析功能(1)- 语法

    语法概览 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGJhbm90ZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQ ...

  10. ADT后windows菜单未找到Android SDK Manager和Android Virtual Device Manager该解决方案的选择

    打开今天凌晨ADT准备编译androidproject的时候,突然发现windows菜单下的Android SDK Manager和Android Virtual Device Manager选项不见 ...