我有两个独立的数据,一个整数和一个字符串。这两个表的大小都是3x3,我想简单地合并这两个表并在datagridview中显示它们,这样我就可以显示一个3x6数据视图。

我想把这两者放在一起,得到下面的图片

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我试过几件事,但似乎做得不对。有时,它使用12个空白单元格填充6x6数据视图,其他时候它保留一个datatable的值,但对第二个值的所有值放置空白。
编辑,我已经编辑了我的代码,以反映对可数据的主键的添加,但现在对于某些表,表中填充了空白单元格。有人能告诉我,为什么数据不能在主服务器上合并而不留下空白。

发布于 2014-02-20 19:45:07
为了合并2 DataTables,您需要一个公共列--我会说,您最好/最简单的选择是向这两个列添加一个主键列,然后您可以像在代码中那样简单地合并它们。
更新:
根据您更新的代码,您的问题在于如何定义主键.
这里有几个问题:
PK的主键列,然后就有了primaryKey(0) = Inttable.Columns("Name")这应该是primaryKey(0) = Inttable.Columns("PK")
它应该是:
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)希望这有帮助,也有意义!!
发布于 2014-02-21 23:58:41
使用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 = Falsehttps://stackoverflow.com/questions/21917641
复制相似问题