今天在使用DataGridView控件(以下简称Dgv)的时候,出现了"索引 -1 没有值。"的错误信息。
场景:我给Dgv绑定的数据源是一个List<MyClass>类型的集合,我new()完就直接给Dgv绑定了,然后在后面根据我的业务逻辑再去填充这个list,然后给Dgv刷新数据源。思路是这样没什么大问题,但是我在给这个list放入几个对象以后,也能在Dgv上展示出来,但是只要我点击Dgv行的时候,就会报错"索引 -1 没有值。",如下图。
其实从图中我们也可以看出来,物料明细Dgv其实是有数据的。包括我调了它的DataSource,count属性是2。但是就是点击行的时候会报错。
于是经过反复调试和分析,最终定位到了错误原因:给Dgv绑定的数据源如果是List<T>列表时,如果首次绑定的这个list数量为0,那么就算后面list里有了对象,也只能在Dgv上作展示用,因为一点击行就会报错。这或许是Winform平台的一个bug?
所以这种奇奇怪怪的问题排查起来相当费劲,但是发现问题以后就好解决了。
以下提供三种解决方法:
①给Dgv绑定数据源时,判断如果list里对象数量为0,就不给Dgv赋值。这种方式简单暴力,改动最小。
②使用BindingSource给这个list包一层再绑定到Dgv。这样有一个问题就是编辑Dgv的单元格时,无法直接映射到我们的list对象中。
③ 最理想的方式,是用BindingList<T>对象代替Ilist<T>对象作为Dgv的数据源,既可彻底解决此问题,而且能实现Dgv修改时自动映射到list对象中(类似于MVVM)。如果是项目初期,可以考虑这种方式。