最近使用DataGridView,把其中遇到的问题和一些知识记录下来,以便以后用到的时候可以快速的想起。
1、添加行号
有时我们在使用DataGridView时会被要求添加在每一行数据前面添加上行号,一边在使用的时候能够准确的了解到当前的数据集合的情况。这里我了解到有两种添加行号的方法,均能正常显示,有需要的可以参考一下。
第一种:
当你设置完成数据源后进行如下的处理:
for ( int i = 0; i < dataGridView2.Rows.Count; i++) //行号 { int j = i + 1; dataGridView2.Rows[i].HeaderCell.Value = j.ToString(); }
通过上面的处理就可以简单的将行号添加了。简单的看来就是循环的给每一行添加,思路比较简洁。
第二种:
这种方式是使用DataGridview自带的事件进行处理,这个事件就是RowPostPaint,我们可以在该事件中添加相应的处理方法就可以添加行号了,相应的代码为:
1 private void dataGridView1_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e) 2 { 3 System.Drawing. Rectangle rectangle = new System.Drawing.Rectangle
(e.RowBounds.Location.X, 4 e.RowBounds.Location.Y, 5 dataGridView1.RowHeadersWidth - 4, 6 e.RowBounds.Height); 7 8 TextRenderer.DrawText(e.Graphics,
(e.RowIndex + 1).ToString(), 9 dataGridView1.RowHeadersDefaultCellStyle.Font, 10 rectangle, 11 dataGridView1.RowHeadersDefaultCellStyle.ForeColor, 12 TextFormatFlags.VerticalCenter | TextFormatFlags .Right); 13 }
这种方式也可以正常显示。
上面两种方式本人均通过实践检验,均能正常显示。
第三种:
private void dgv_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) { e.Row.HeaderCell.Value = (e.Row.Index + 1).ToString(); }
这种方式也能达到相应的效果。
2、高亮显示某一行
在我们的实际项目中可能会有这样的要求,当某条数据满足某个条件的时候将这条数据的整行或者当前的单元格高亮显示出来,因为原理都是一样的,这里就记录一下其中的一种情况。具体的实现是非常简单的,如果看了上面添加行号的话,这里就可以很好的理解了,原理都是一样的,这是处理的属性不同而已,具体为:
1 for ( int i = 0; i < dataGridView2.Rows.Count; i++) 2 { 3 if (dataGridView2.Rows[i].Cells["FLAG" ].Value.ToString() == "2") { 4 this.dataGridView2.Rows[i].DefaultCellStyle.BackColor= Color.Red; 5 } 6 }
其实就是跟上面第一种的地方是一样的,处理的属性不一样就是了。
3、添加复选框
有时候我们会被要求到,我们可以选择数据集的一行或者多行,虽然我们可以通过ctrl键进行实现,但是在实际的工作当中,我们更加喜欢复选框这样一种形式。而这个形式的实现只要我们添加一列用于选择就可以了,我们在添加这一列的时候,选择ColumnType为DataGridViewCheckBoxColumn即可,我们也可以根据需要选择多种形式。
4、犯的一些错误
1、表头与数据库中不对应,显示的数据没有按规则显示
我们在编辑字段的时候我们一般会编辑两个属性,一个是HeaderText,一个是DataPropertyName,前一个是用于显示在界面上的,后一个是与设置的数据集中的字段是一致的。如果后面一个没有进行设置就会出现不按预想的形式显示的问题。顺便有一个小的技巧,当我们不想显示某一列的时候,我们可以设置属性Visible为False即可。
2、通过属性字段来获取单元格的数据出错
假如我们要进行这样的形式(dataGridView2.Rows[i].Cells["FLAG" ].Value.ToString())进行获取单元格的数据,我们单单设置DataPropertyName属性是不够的,我们还要设置Name属性为FLAG(根据具体的字段进行相应的设置)。补充:DataPropertyName为设置数据的时候使用,NAME为获取数据的使用。
5、说明
在以后的使用当中,如果还有一些可以分享的东西,我也会继续添加的。