2016-09-30 45 views
2

我需要將數據導入到DataGridView,但我需要在上次導入後堆疊數據。所以,如果我的第一個文件是100條記錄,而我的第二個文件是200條記錄,我現在應該有300條記錄。我需要能夠按導入按鈕瀏覽到一個文件並導入它,它會添加到數據集的末尾。文件和記錄的數量會有很大的不同。這裏是我的代碼,但現在它只是每次導入新數據時覆蓋已在DataGridView中的數據。 excel文件只是一個測試文件,最終生病添加文件夾瀏覽器對話框,我將選擇「x」數量的文件。如何使用vb.net將數據從無限量的數據文件導入DataGridView?

MyConnection = New System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\Work\4pc_test1.xlsx;Extended Properties=Excel 12.0;") 
'MyConnection = New System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" & fd.FileName & "';Extended Properties=Excel 8.0;") 
MyCommand = New System.Data.OleDb.OleDbDataAdapter("select * from [Sheet1$]", MyConnection) 
MyCommand.TableMappings.Add("Table", "Net-informations.com") 
DtSet = New System.Data.DataSet 
MyCommand.Fill(DtSet) 
DataGridView1.DataSource = DtSet.Tables(0) 
MyConnection.Close() 
+0

@Reza Ahaei我希望這是我需要做的更好的描述:) – Chrisetiquette

+0

正如我在[評論](http://stackoverflow.com/questions/39758766/adding-multiple-datasources-to -a-datagridview-vb-net#comment66859353_39759762):*請注意,該表應該位於保留以前添加的行的範圍內。例如,如果您創建一個將行從excel導入到'DataTable'的方法,則應該在表單級別創建'DataTable'並將其傳遞給該方法,而不應該在方法中創建它。* –

+0

@Plutonix發佈的答案涵蓋了您需要的答案。默認情況下[DataTable.Load](http://stackoverflow.com/q/39676151/3110834)將結果添加到'DataTable'中。 –

回答

3

如果您希望將數據追加,你不應該創建一個新的DataSetDatatable每次(其實你不需要一個DataSet都爲一個表)。創建並使用同一個來保存數據。

窗體/類級別的變量:

Private dtXLS As DataTable 
' once connection string to rule them all 
Private AceXLSConnStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='{0}';Extended Properties=Excel 12.0;" 

然後控制迴路:

Private Sub btnLoad_Click(etc etc 
    ' create table ONCE 
    dtXLS = New DataTable 
    ' files to laod: 
    Dim files As String() = {"C:\Temp\Sample1.xls", "C:\Temp\Sample2.xls"} 

    For Each fname In files 
     AppendXLS(fname) 
    Next 
    dgv1.DataSource = dtXLS 
End Sub 

Private Sub AppendXLS(filname As String) 
    ' create conn str for this file 
    Dim connx = String.Format(AceXLSConnStr, filname) 

    ' always dispose of connections and commands 
    Using dbCon As New OleDbConnection(connx) 
     Using cmd As New OleDbCommand("select * from [Sheet1$]", dbCon) 
      dbCon.Open() 
      dtXLS.Load(cmd.ExecuteReader()) 
     End Using 
    End Using 
End Sub 

聲明(Private)在窗體級別,連接字符串掩模和DataTable可用於這兩種方法。第一個創建DataTable實例(僅限一次),並將數據連續添加到另一個實例中。

另外,特別是如果你有一個「無限」數量的文件加載,你將要確保關閉並處置DBCommand和連接。一個Using塊聲明並創建一個供使用的對象,然後在最後處置它。

結果(文件1有1-5項,文件2有項目10-15): enter image description here


因爲你似乎至少有一點迷茫由Scope思路,概括地說:

  • Dim/Private | Friend | Public聲明一個變量,多數民衆贊成。
  • New創建一個實例。 DimNew並不總是必須在一起。事實上,當你發現自己打字Dim foo As New...停下來思考,如果這是你真正想要的,因爲....
  • 聲明一個變量決定了它的Scope - 它可以被訪問。在方法中聲明的變量只存在於那裏。

還有其他等級的範圍,如塊級。請參閱Reference variables and objects elsewhere in a form瞭解更多細節。

相關問題