2014-02-20 4 views
5

У меня есть два отдельных набора данных, один из целых чисел и один из строк. Оба размера 3x3, и я хочу просто объединить две таблицы и показать их в представлении datagridview, чтобы показать 3x6 datagridview.Объединить столбцы разных типов из данных в один более крупный файл данных

Two separate datatables

И я хочу поставить два вместе, чтобы получить изображение ниже

Datatables joined

Dim stringtable As New DataTable 
    stringtable.Columns.Add("PK", GetType(Integer)) 
    stringtable.Columns.Add("Col1", GetType(Integer)) 
    stringtable.Columns.Add("Col2", GetType(Integer)) 
    stringtable.Columns.Add("Col3", GetType(Integer)) 

    stringtable.Rows.Add(1, 1, 1, 1) 
    stringtable.Rows.Add(2, 2, 2, 2) 
    stringtable.Rows.Add(3, 3, 3, 3) 

    Dim primaryKey(1) As DataColumn 
    primaryKey(0) = stringtable.Columns("Name") 
    stringtable.PrimaryKey = primaryKey 

    Dim Inttable As New DataTable 
    Inttable.Columns.Add("PK", GetType(Integer)) 
    Inttable.Columns.Add("ColA", GetType(String)) 
    Inttable.Columns.Add("ColB", GetType(String)) 
    Inttable.Columns.Add("ColC", GetType(String)) 

    Inttable.Rows.Add(1, "A", "A", "A") 
    Inttable.Rows.Add(2, "B", "B", "B") 
    Inttable.Rows.Add(3, "C", "C", "C") 

    primaryKey(0) = Inttable.Columns("Name") 
    Inttable.PrimaryKey = primaryKey 

    DataGridView2.DataSource = stringtable 
    DataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
    DataGridView2.AllowUserToAddRows = False 

    DataGridView1.DataSource = Inttable 
    DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
    DataGridView1.AllowUserToAddRows = False 


    ''This is where I can't figure out what do 
    Dim mergedTable As New DataTable 
    mergedTable = DataGridView2.DataSource 
    mergedTable.Merge(Inttable, False, MissingSchemaAction.Add) 

    DataGridView3.DataSource = mergedTable 

Я попробовал несколько вещей, но не могу показаться, чтобы получить это право. Иногда он заполняет 6x6 datagridview 12 незанятыми ячейками, а в других случаях он сохраняет значения одного datatable, но ставит пробелы для всех значений второго.

EDIT Я редактировал свой код, чтобы отразить добавление первичного ключа к DataTables, но теперь в течение некоторой таблицы заселяет с пустыми ячейками. Может кто-нибудь сказать мне, почему DataTables обыкновение просто сливать на первичном, не выходя из заготовок

enter image description here

ответ

2

Для того, чтобы объединить 2 DataTables, вам нужен общий столбец - Вы лучший/простой бет, я бы сказал, было бы чтобы добавить столбец первичного ключа к обоим, а затем вы можете просто объединить их так же, как в коде.


UPDATE:

На основе вашего обновленного кода, ваша проблема в том, как вы определяете свой первичный ключ ...

Есть несколько проблем здесь:

  1. Вы определили свой столбец первичного ключа с именем PK, тогда у вас есть primaryKey(0) = Inttable.Columns("Name")

Это должно быть primaryKey(0) = Inttable.Columns("PK")

  1. Вы определяете свой PrimaryKey массив следующим образом:

    Dim PrimaryKey (1) Как DataColumn

Оно должно быть:

Dim primaryKey(0) As DataColumn 

У него есть только одно значение (ваш способ на самом деле создает 2-элементный массив, поскольку он основан на нулевом языке для массивов).

Ваш измененный код должен выглядеть следующим образом:

Dim primaryKey(0) As DataColumn 
primaryKey(0) = stringtable.Columns("PK") 
stringtable.PrimaryKey = primaryKey 

Мой предпочтительный способ написания этого, хотя, (хотя он будет выполнять ту же самую вещь) будет выглядеть следующим образом:

stringtable.PrimaryKey = {stringtable.Columns("PK")} 

Просто, чтобы помочь вам, вот какой код я создал, чтобы сделать то, что вы хотите сделать (без части DataGridView)

Dim stringtable As New DataTable 
stringtable.Columns.Add("PK", GetType(Integer)) 
stringtable.Columns.Add("Col1", GetType(Integer)) 
stringtable.Columns.Add("Col2", GetType(Integer)) 
stringtable.Columns.Add("Col3", GetType(Integer)) 

stringtable.Rows.Add(1, 1, 1, 1) 
stringtable.Rows.Add(2, 2, 2, 2) 
stringtable.Rows.Add(3, 3, 3, 3) 

stringtable.PrimaryKey = {stringtable.Columns("PK")} 

Dim Inttable As New DataTable 
Inttable.Columns.Add("PK", GetType(Integer)) 
Inttable.Columns.Add("ColA", GetType(String)) 
Inttable.Columns.Add("ColB", GetType(String)) 
Inttable.Columns.Add("ColC", GetType(String)) 

Inttable.Rows.Add(1, "A", "A", "A") 
Inttable.Rows.Add(2, "B", "B", "B") 
Inttable.Rows.Add(3, "C", "C", "C") 

Inttable.PrimaryKey = {Inttable.Columns("PK")} 

stringtable.Merge(Inttable, False, MissingSchemaAction.AddWithKey) 

Надеюсь, что это поможет и имеет смысл!

+0

прочитал об установке колонки, чтобы быть основным, но так как не было никакой общей колонки я надеялся, что может более легкий путь, чем все, что модификации данных. Если я прав, не так просто просто добавить столбец с циклом через все строки? это примеры таблиц, и мои SQL-запросы производят гораздо более большие данные datagridviews – user3334230

+0

Можете ли вы посмотреть мое редактирование, Большое спасибо. – user3334230

+0

@ user3334230, только что обновил мой ответ - Надеюсь, это объяснит это лучше/делает трюк для вас ... –

0

Использование LINQ

 Dim intTable As New DataTable 
     Dim stringTable As New DataTable 

     intTable.Columns.Add("Col1", GetType(Integer)) 
     intTable.Columns.Add("Col2", GetType(Integer)) 
     intTable.Columns.Add("Col3", GetType(Integer)) 

     intTable.Rows.Add(1, 1, 1) 
     intTable.Rows.Add(2, 2, 2) 
     intTable.Rows.Add(3, 3, 3) 

     stringTable.Columns.Add("ColA", GetType(String)) 
     stringTable.Columns.Add("ColB", GetType(String)) 
     stringTable.Columns.Add("ColC", GetType(String)) 

     stringTable.Rows.Add("A", "A", "A") 
     stringTable.Rows.Add("B", "B", "B") 
     stringTable.Rows.Add("C", "C", "C") 

     DataGridView2.DataSource = intTable 
     DataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
     DataGridView2.AllowUserToAddRows = False 

     DataGridView1.DataSource = stringTable 
     DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
     DataGridView1.AllowUserToAddRows = False 

     Dim indexColumn1 As New Data.DataColumn("Index", GetType(Integer)) 
     Dim indexColumn2 As New Data.DataColumn("Index", GetType(Integer)) 
     intTable.Columns.Add(indexColumn1) 
     stringTable.Columns.Add(indexColumn2) 
     For i As Integer = 0 To intTable.Rows.Count - 1 
      intTable.Rows(i)("Index") = i 
      stringTable.Rows(i)("Index") = i 
     Next 

     Dim resultTable = From i In intTable.AsEnumerable() 
          Join s In stringTable.AsEnumerable() 
          On s("Index") Equals i("Index") 
          Select {i("Col1"), i("Col2"), i("Col3"), s("ColA"), s("ColB"), s("ColC")} 

     Dim dt As New DataTable() 
     dt.Columns.AddRange({New DataColumn("Col1"), New DataColumn("Col2"), New DataColumn("Col3"), 
          New DataColumn("ColA"), New DataColumn("ColB"), New DataColumn("ColC")}) 
     For Each result In resultTable 
      dt.LoadDataRow(result, True) 
     Next 

     DataGridView3.DataSource = dt 
     DataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill 
     DataGridView3.AllowUserToAddRows = False 
Смежные вопросы