我的软件出错了。我的表单包含一个与MS_access数据库连接的DataGridView。
当我点击DataGridView中的一行时,我收到此错误:
指数超出范围。必须是非负数且小于集合的大小。
参数名称:索引
我的代码:
Try
If (DataGridView1.Rows.Count <= 0) Then Return
FlatTextBox1.Text = String.Empty
FlatTextBox2.Text = String.Empty
FlatTextBox3.Text = String.Empty
RichTextBox1.Text = String.Empty
Dim indx As String = DataGridView1(1, DataGridView1.SelectedRows(0).Index).Value.ToString
Dim dt As DataTable = New DBConnect().selectdata(String.Format("SELECT famille3.Article, famille3.quantité, famille3.prixch, famille3.prixvn, famille3.dateex, famille3.description FROM famille3 where famille3.ID = {0} ", indx))
If dt.Rows.Count > 0 Then
FlatTextBox1.Text = dt.Rows(0)(0).ToString
FlatTextBox2.Text = dt.Rows(0)(1).ToString
FlatTextBox3.Text = dt.Rows(0)(2).ToString
FlatTextBox9.Text = dt.Rows(0)(3).ToString
FlatTextBox10.Text = (dt.Rows(0)(3).ToString - dt.Rows(0)(2).ToString) * dt.Rows(0)(1).ToString
FlatTextBox11.Text = dt.Rows(0)(4).ToString
RichTextBox1.Text = dt.Rows(0)(5).ToString
End If
dt.Dispose()
dt = Nothing
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
我认为堆栈在这里
Dim indx As String = DataGridView1(1, DataGridView1.SelectedRows(0).Index).Value.ToString
我该如何解决?
答案 0 :(得分:1)
在DataGridView的CellClick事件中,您会收到类型为DataGridViewCellEventArgs
的参数。此参数包含已点击单元格的ColumnIndex
和RowIndex
。因此,获取所单击行的第1列的值非常简单,因为
Sub DataGridView1_CellClick(sender as Object,e As DataGridViewCellEventArgs)
Dim indx As Integer = Convert.ToInt32(DataGridView1(1, e.RowIndex).Value)
.....
请注意,我已将Convert.ToInt32
应用于第一列的值。我假设这是查找记录的数字主键。请记住,VB.NET允许您自由地将字符串转换为数字(VB6兼容性),但一般来说这被认为是一种不好的做法。检查您的项目属性并设置Option Strict On
,您将被迫改进您的代码。
我觉得另一个建议就是不要以这种方式编写查询。此方法称为 sql string concatenation ,它是Sql Injection的根。 (在目前的情况下,没有大的风险,但最好养成良好的习惯,并始终使用参数化查询)