2016-11-11 71 views
0

我的軟件有錯誤。我的表單包含一個與MS_access數據庫連接的DataGridView。Datagridview SelectedRows索引錯誤| Access和VB.NET

當我點擊在DataGridView一排,我得到這個錯誤:

Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

我的代碼:

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

你有多少列? – Imad

+0

我有3列(1不可見&2可見) –

+0

如果您沒有任何使用索引零的SelectedRows將產生此錯誤。 – Steve

回答

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字符串連接並且它是Sql Injection的根。 (在你目前的情況下,沒有大的風險,但更好地採取良好的習慣,並始終使用參數化查詢)

+0

這個。打我吧 – djv

+0

謝謝!這就是解決我的問題,謝謝egain –

+0

@steve下一行'... where famille3.ID = {0}「,indx ))'無論如何都會讓int 32變得非常混亂。 – djv