我有两个单独的数据表,一个是整数,一个是字符串。两者的大小都是 3x3,我想简单地合并两个表并将它们显示在 datagridview 中,以便显示 3x6 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)
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 的 datagridview,而有时,它会保留一个数据表的值,但为第二个数据表的所有值添加空白。
编辑 我已经编辑了代码以反射(reflect)向数据表添加主键,但现在对于某些表填充了空白单元格。有人可以告诉我为什么数据表不会只在主数据库上合并而不留空白
最佳答案
为了合并 2 个数据表,您需要一个公共(public)列 - 我想说,最好/最简单的选择是向两个数据表添加一个主键列,然后您可以像在代码中那样简单地合并它们。
<小时/>更新:
根据您更新的代码,您的问题在于如何定义主键...
这里有几个问题:
- 您已使用名称
PK
定义了主键列,则primaryKey(0) = Inttable.Columns("Name")
这应该是primaryKey(0) = Inttable.Columns("PK")
您定义primaryKey数组如下:
将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)
希望这有帮助并且有意义!!
关于vb.net - 将数据表中不同类型的列合并到一个更大的数据表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21917641/