DataGridView控件显示行号的正确代码及分析
代码 分析 显示 正确 控件 行号 DataGridView
2023-06-13 09:15:04 时间
前些天在写个小程序,用到DataGridView,想给它动态的显示行号。不是很费劲GOOGLE了一下,这GOOGLE不要紧,发现了不少问题。以下基本上都是GOOGLE搜索出来的网上的一些解决方法,千篇一律都是这样的:
privatevoidDataGridView1_RowsAdded(objectsender,DataGridViewRowsAddedEventArgse)
{
for(inti=0;i<e.RowCount;i++)
{
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Value=(e.RowIndex+i+1).ToString();
}
for(inti=e.RowIndex+e.RowCount;i<this.dgvKBRollUp.Rows.Count;i++)
{
this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[i].HeaderCell.Value=(i+1).ToString();
}
}
privatevoidDataGridView1_RowsRemoved(objectsender,DataGridViewRowsRemovedEventArgse)
{
for(inti=0;i<e.RowCount;i++)
{
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Value=(e.RowIndex+i+1).ToString();
}
for(inti=e.RowIndex+e.RowCount;i<this.dgvKBRollUp.Rows.Count;i++)
{
this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[i].HeaderCell.Value=(i+1).ToString();
}
}
只要用过这段代码的人就应该发现这段代码是运行出错的。原因就出在RowsRemoved事件里,会抛出一个Indexoutofrange的异常。然而就是这么一段有错的代码,几乎充斥着整个互联网,千篇一律的COPY,没有一个人纠正。
在RowsRemoved事件里,最开始生成DataGridView的数据的时候,也是会触发这个事件的。这个时候DataGridView控件的Rows.Count就是0。那下面这行代码就有问题了:
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
e.RowIndex+i,这里对应的是Rows[0],但是Rows.Count还是0啊,Rows[0]是不存在的。要存在Rows[0]起码DataGridView控件要有一行才行。为了避免这个错误,小小的修改代码就行了:
privatevoiddgvKBRollUp_RowsRemoved(objectsender,DataGridViewRowsRemovedEventArgse)
{
if(dgvKBRollUp.Rows.Count!=0)
{
for(inti=0;i<e.RowCount;i++)
{
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[e.RowIndex+i].HeaderCell.Value=(e.RowIndex+i+1).ToString();
}
for(inti=e.RowIndex+e.RowCount;i<this.dgvKBRollUp.Rows.Count;i++)
{
this.dgvKBRollUp.Rows[i].HeaderCell.Style.Alignment=DataGridViewContentAlignment.MiddleRight;
this.dgvKBRollUp.Rows[i].HeaderCell.Value=(i+1).ToString();
}
}
只要加上一个对Rows.Count的判断就可以避免这个错误。希望网上的一些COPY的朋友也要注意了,以后COPY过来的时候,自己还是要动手验证一下。将一个错误的信息胡乱的传播是对一些新手以及自己都不怎么好的。
System.Text.StringBuildermessageBoxCS=newSystem.Text.StringBuilder();
messageBoxCS.AppendFormat("{0}={1}","RowIndex",e.RowIndex);
messageBoxCS.AppendLine();
messageBoxCS.AppendFormat("{0}={1}","RowCount",e.RowCount);
messageBoxCS.AppendLine();
MessageBox.Show(messageBoxCS.ToString(),"RowsRemovedEvent");
通过这段代码你可以很轻松地跟踪事件参数里的e.RowIndex和e.RowCount的值。当然你可以DEBUG,一样的。我就是DEBUG的O(∩_∩)O~
相关文章
- 单细胞代码解析-妇科癌症单细胞转录组及染色质可及性分析10
- 【汇编实战开发笔记】从汇编代码中找出一段普通的for循环变成“死循环”的根本原因(RT-Thread技术论坛优秀文章)
- 【视频】什么是非线性模型与R语言多项式回归、局部平滑样条、 广义相加GAM分析工资数据|数据分享|附代码数据
- 【视频】主成分分析PCA降维方法和R语言分析葡萄酒可视化实例|数据分享|附代码数据
- R语言用Copulas模型的尾部相依性分析损失赔偿费用|附代码数据
- 介绍一款 ABAP 代码搜索工具 RS_ABAP_SOURCE_SCAN 试读版
- 线性回归和时间序列分析北京房价影响因素可视化案例|附代码数据
- R语言中贝叶斯网络(BN)、动态贝叶斯网络、线性模型分析错颌畸形数据|附代码数据
- 【Android 性能优化】应用启动优化 ( Trace 文件分析 | 结合代码分析 Trace 文件 )
- 用哪种语言写的应用漏洞最严重?六大主流语言代码漏洞分析报告出炉
- R语言EG(Engle-Granger)两步法协整检验、RESET、格兰杰因果检验、VAR模型分析CPI和PPI时间序列关系|附代码数据
- R语言nlme、nlmer、lme4用(非)线性混合模型non-linear mixed model分析藻类数据实例|附代码数据
- HDFS的Java客户端操作代码(查看HDFS下的文件是否存在)详解大数据
- Qt纯代码设计UI实例分析
- [动图]iOS/tvOS 14.6代码泄露天机 苹果要推Beats品牌TWS耳机
- 探究Linux病毒代码:保障系统安全从分析代码开始(linux病毒代码)
- 在textarea中屏蔽js的某个function的javascript代码
- linuxURL的301重定向代码分析
- DIV+CSS网页另类上下布局的实例代码
- Js冒泡事件阻止实现代码
- jquery实现文字由下到上循环滚动的实例代码
- python发送arp欺骗攻击代码分析
- php导出csv格式数据并将数字转换成文本的思路以及代码分享
- 改变状态栏文字的js代码
- Javascript完美运动框架(逐行分析代码,让你轻松了运动的原理)