关于DataGridView的使用注意事项
写在前面
在日常使用DataGridView时,大多数情况下用起来都特别简单,但偶尔遇到一些坑时也会折磨人很久。现在编写此篇博客, 以记录在平时工作时遇到的一些坑。
场景1:DataGridView的CellFormatting事件
因为业务需要,我的DataGridView绑定的数据源中,有个列不在DataSource绑定的对象里,这时就需要增加自定义列,同时也需要自己编写展示自定义列的数据的处理,于是我就对这个列增加了CellFormatting事件。最初的时候,我编写的代码如下,结果发现我原本DataSource绑定的对象中的任意一个列,一旦有null值,就会报DataFormatted错误,我百思不得其解,最后才发现,我把这个e.FormattingApplied写在了CellFormatting事件方法的最外面,如下代码所示:
// 错误示例private void DGV_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{if (e.ColumnIndex == dgv.Columns["attr1"].Index){// 业务逻辑if(xxx){e.Value = xxx.ToString();}else{e.Value = string.Empty;}}e.FormattingApplied = true; // 致命错误
}
正确的应该是这么写:
// 改正之后private void DGV_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{if (e.ColumnIndex == dgv.Columns["attr1"].Index){// 业务逻辑if(xxx){e.Value = xxx.ToString();}else{e.Value = string.Empty;}e.FormattingApplied = true; // 此行代码如果放至最外层,会对DataGridView的每一个列都进行格式化}}
原因:把e.FormattingApplied=true写在最外层,就会导致数据源所有的列都会生效,这时候一旦你数据源中的某个列有null值,就会报异常。而放在if内部,则只会对这单个列生效。(还是不能过于省代码)
其他场景等后续更新