关于DataGridView的索引

简介:
最近在做一个课堂练习是被郁闷了一把。现成的事成了想当然的事。案例如下。
是一个WinForm 程序,在DataGridView 绑定控件后,选择一行,进行操作,代码如下:
数据绑定代码:
SqlDataAdapter  da = new SqlDataAdapter("select id from shuji","server=.;database=tushudb;uid=sa;pwd=sa;");
            DataTable dt = new DataTable();
            da.Fill(dt);
            My_DGV.DataSource = dt;
这是选择一行后的操作
label1 .Text =   My_DGV.Rows[e.RowIndex].Cells[0].Value.ToString();
对于DataGridView来说,有两个例,代码如下:  
            // Column1         
            this.Column1.DataPropertyName = "id";
            this.Column1.HeaderText = "ID";
            this.Column1.Name = "Column1";           
            // Column2
            this.Column2.DataPropertyName = "ISBN";
            this.Column2.HeaderText = "ISBN";
            this.Column2.Name = "Column2";
上面的两行,我是先添加Column2 ,后添加Conlumn1 的,然后把name 属性换掉的。
如果数据库中有数据,运行后,在DataGridView 中就会有数据记录:
当我们选一行时,会报一个“未将对象引用设置到对象的实例”。当出现这个问题,我很是纳闷,因为我查询出一行,并且已经在ID 这列中显示出来了,当我取这某一行的列索引为0 时,出问题了,没有实例,也就是为null 。不应该呀,于是就找根源。
先看局部变量窗口中的My_DGV 对象,数据都在这个对象的Rows 集合下,并且在非公共成员List 集合中,这个集合存着所有Grid 的行,在这个集合中的某个元素中,有一个Cells 的属性,这个属性是这一行所有列的集合,展开这个属性的List 属性,因为我们取的是第0 列索引,所以展开下标为0 的,再展开base ,其中有一个value 值,不难看到,这个值是null ,也就是这列上没有值,为什么呢?如果仔细看,有一个OwningColum 的属性,这个属性中明确的看到,Name=Column2 Index=0 ,也就是告诉我们,即使是我们改了每个列的name 属性,但一开始我们在DataGridView Columns 集合中添加列的顺序是没有变的,即在集合中的位置是不变的。所以上图中的ID 列,是和ISBN 列换了一下位置的,所以在找下标为0 的列是,其实找的是ISBN ,是没有数据的。所以最好不要用下标来取值。
当然,我们可以取行某列时,改成如下
label1 .Text =   My_DGV.Rows[e.RowIndex].Cells["Column1"].Value.ToString();
这样就会显示的告我们选的是那一行的数据。













本文转自桂素伟51CTO博客,原文链接:http://blog.51cto.com/axzxs/288978,如需转载请自行联系原作者


相关文章
C#编程-72:dataGridView删除行
C#编程-72:dataGridView删除行
292 0
C#编程-79:DataGridView分页显示
C#编程-79:DataGridView分页显示
160 0
C#编程-79:DataGridView分页显示
C#编程-74:dataGridView排序和筛选
C#编程-74:dataGridView排序和筛选
317 0
DataGridView单元格合并
本文章转载:http://www.cnblogs.com/xiaofengfeng/p/3382094.html 图: 代码就是如此简单 文件下载:DataGridView单元格合并源码   也可以参考: http://www.
737 0