2017-02-01 2 views
0

Я пытаюсь скопировать строки из одного DataTable в другой, но только копировать строки, где данные еще не сохранены в таблице базы данных.Копирование строк из одного DataTable в другое Отображает ничего

SQL сторона этого работает нормально, он возвращает правильное число столбцов, однако, когда я добавляю строки, которые были найдены на мой второй DataTable и установить его в качестве DataSource для моей сетки, нет никаких данных, отображаемых , хотя есть добавленная строка, так как селектор строк виден.

Что я делаю неправильно, и почему данные не копируются?

lftable = New DataTable 

Try 
    For Each dc As DataColumn In lineTable.Columns 
    lftable.Columns.Add() 
    Next 

    Dim ds As New DataSet 

    For Each row As DataRow In lineTable.Rows 
    Dim da As New OleDbDataAdapter("SELECT * FROM [Order_Freight] WHERE [Order_Number] = ? AND [Product_Code] <> ?", con) 
    da.SelectCommand.Parameters.Add("@num", OleDbType.Integer).Value = orderNum 
    da.SelectCommand.Parameters.Add("@prod", OleDbType.VarChar).Value = row.Item("Product_Code") 
    da.Fill(ds) 

    For Each dr As DataRow In ds.Tables(0).Rows 
     Dim nRow = lftable.Rows.Add() 
     nRow.ItemArray = dr.ItemArray() 
    Next 
Next 

ugProducts.DataSource = lfTable 

Скриншот сетки после присвоения ему DataSource

enter image description here

+0

@ AlexB. Ошибка компиляции - выражение не производит значение – David

+0

Да, мой комментарий был вздор. См. Мой ответ. –

ответ

1

правильно заполнить столбцы:

For Each dc As DataColumn In lineTable.Columns 
    lftable.Columns.Add(new DataColumn(dc.ColumnName, dc.DataType)); 
Next 

Вы можете использовать перегрузку функции Row.Add, которая позволяет обеспечить ItemArray:

For Each dr As DataRow In ds.Tables(0).Rows 
     lftable.Rows.Add(dr.ItemArray) 
     'nRow.ItemArray = dr.ItemArray() <-- remove 
Next 
+0

Hmm, такой же результат .... – David

+0

который результат вы получаете? –

+0

То же самое, что на картинке – David

0

Вместо этого кода:

' For Each dc As DataColumn In lineTable.Columns 
     ' lftable.Columns.Add() > 
     ' lftable.Columns.Add(dc) 
    ' Next 

Использование DataTable.Clone(), чтобы скопировать только столбцы в lineTable для lftable

lftable = lineTable.Clone(); 

А потом

For Each dr As DataRow In ds.Tables(0).Rows 
     lftable.Rows.Add(dr.ItemArray) 
    Next 
+0

Ошибка:« Column »Product_ID уже принадлежит другому DataTable« – David

+0

Это не сработает. @David должен создать новый объект DataColumn и добавить его в коллекцию, например 'lftable.Columns.Add (новый DataColumn (dc.ColumnName, dc.DataType)),' –

+0

@AlexB. «Значение типа System.Data.DataColumn не может быть преобразовано в тип« String »« – David

Смежные вопросы