Datagridview SelectedRows索引错误|访问和VB.NET

时间:2016-11-11 13:29:48

标签: vb.net datagridview

我的软件出错了。我的表单包含一个与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

我该如何解决?

1 个答案:

答案 0 :(得分:1)

在DataGridView的CellClick事件中,您会收到类型为DataGridViewCellEventArgs的参数。此参数包含已点击单元格的ColumnIndexRowIndex。因此,获取所单击行的第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的根。 (在目前的情况下,没有大的风险,但最好养成良好的习惯,并始终使用参数化查询)