选中DataGridView行后获取连续3行学生代码至文本框报错求助
解决DataGridView选中行后获取连续3行代码到TextBox的问题
原代码的错误点
- 行索引获取错误:你用
SelectedRows(I)获取的是选中行集合里的行,不是该行在DataGridView中的实际位置索引,无法定位到连续的下两行。 - 列索引错误:你的列顺序是学生姓名(索引0)、班级(索引1)、代码(索引2),原代码用
Cells(1)取的是班级列,不是代码列。 - 未处理边界情况:当选中最后1行或2行时,
I+1或I+2会超出总行数,直接访问会触发索引越界异常。 - 未处理空值:如果单元格值为
DBNull.Value,直接调用ToString()会报错。
修正后的代码
在DataGridView的SelectionChanged事件中添加以下逻辑(确保已绑定该事件):
Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged ' 先判断是否有有效选中行 If DataGridView1.CurrentRow Is Nothing Then TextBox1.Clear() TextBox2.Clear() TextBox3.Clear() Return End If Dim currentRowIndex As Integer = DataGridView1.CurrentRow.Index Dim totalRowCount As Integer = DataGridView1.Rows.Count ' 赋值第一个TextBox:当前选中行的代码 If currentRowIndex < totalRowCount Then Dim codeValue As Object = DataGridView1.Rows(currentRowIndex).Cells(2).Value TextBox1.Text = If(codeValue IsNot DBNull.Value, codeValue.ToString(), String.Empty) Else TextBox1.Clear() End If ' 赋值第二个TextBox:下一行的代码 If currentRowIndex + 1 < totalRowCount Then Dim codeValue As Object = DataGridView1.Rows(currentRowIndex + 1).Cells(2).Value TextBox2.Text = If(codeValue IsNot DBNull.Value, codeValue.ToString(), String.Empty) Else TextBox2.Clear() End If ' 赋值第三个TextBox:下下一行的代码 If currentRowIndex + 2 < totalRowCount Then Dim codeValue As Object = DataGridView1.Rows(currentRowIndex + 2).Cells(2).Value TextBox3.Text = If(codeValue IsNot DBNull.Value, codeValue.ToString(), String.Empty) Else TextBox3.Clear() End If End Sub
代码说明
- 获取正确的行位置:用
CurrentRow.Index获取选中行在DataGridView中的实际索引,以此定位连续的行。 - 修正列索引:用
Cells(2)访问代码列(索引从0开始计数)。 - 边界处理:通过判断
currentRowIndex + n < totalRowCount确保不会访问超出范围的行,避免索引越界。 - 空值处理:用
If(codeValue IsNot DBNull.Value, ...)判断单元格值是否为空,防止ToString()报错。 - 空行判断:先检查
CurrentRow是否存在,避免未选中行时触发空引用异常。
内容的提问来源于stack exchange,提问作者Hazem
相关产品推荐
相关产品推荐

