DataGridView赋值DateTimePicker触发索引超出范围错误如何解决
VB.NET DataGridView CellMouseClick事件索引越界问题修复方案
报错根因
- 触发事件时点击了DataGridView的表头行(此时
e.RowIndex值为-1),或是底部未录入数据的空白新增行,行索引超出可用范围 - 当前DataGridView的列总数不足7列(单元格索引从0开始计数,
Cells(6)要求至少存在7列),目标列不存在 - 额外隐患:
DateTimePicker.Value为DateTime类型,直接赋值字符串会存在隐式类型转换风险,且如果单元格值为数据库空值DBNull,调用ToString会直接报错
修复后完整代码
Private Sub IssueDGV_CellMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles IssueDGV.CellMouseClick ' 过滤表头、空白新增行的无效点击 If e.RowIndex < 0 OrElse IssueDGV.Rows(e.RowIndex).IsNewRow Then Return End If Dim row As DataGridViewRow = IssueDGV.Rows(e.RowIndex) ' 校验列数是否足够,避免索引越界 If row.Cells.Count < 7 Then MessageBox.Show("当前表格列数不足,无法读取日期列数据") Return End If Bidlbl.Text = If(row.Cells(2).Value Is DBNull.Value, "", row.Cells(2).Value.ToString()) Booktitlelbl.Text = If(row.Cells(3).Value Is DBNull.Value, "", row.Cells(3).Value.ToString()) ' 处理日期空值+类型安全转换 If row.Cells(6).Value IsNot DBNull.Value Then Dim cellDate As DateTime If DateTime.TryParse(row.Cells(6).Value.ToString(), cellDate) Then DateTimePicker1.Value = cellDate Else ' 日期格式无效时给默认值 DateTimePicker1.Value = DateTime.Now End If End If If MainStudent.stdidTB.Text = "" Then key = 0 Else key = If(row.Cells(0).Value Is DBNull.Value, 0, Convert.ToInt32(row.Cells(0).Value.ToString())) End If End Sub
优化思路
- 尽量使用列名而非索引读取单元格,比如将
row.Cells(6)替换为row.Cells("你的日期列绑定的字段名"),可以避免调整表格列顺序后索引失效的问题 - 如果不需要响应右键点击等特殊鼠标操作,可以改用
CellClick事件,减少无效触发 - 如果允许日期列为空,可以给
DateTimePicker开启ShowCheckBox属性,空值时勾选框置为未选中状态即可
内容的提问来源于stack exchange,提问作者samuel dube
相关产品推荐
相关产品推荐

