vb.net - 将数据表中不同类型的列合并到一个更大的数据表中

标签 vb.net datagridview datatable merge

我有两个单独的数据表,一个是整数,一个是字符串。两者的大小都是 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

我尝试了一些方法,但似乎无法做到这一点。有时,它会用 12 个空白单元格填充 6x6 的 datagridview,而有时,它会保留一个数据表的值,但为第二个数据表的所有值添加空白。

编辑 我已经编辑了代码以反射(reflect)向数据表添加主键,但现在对于某些表填充了空白单元格。有人可以告诉我为什么数据表不会只在主数据库上合并而不留空白

enter image description here

最佳答案

为了合并 2 个数据表,您需要一个公共(public)列 - 我想说,最好/最简单的选择是向两个数据表添加一个主键列,然后您可以像在代码中那样简单地合并它们。

<小时/>

更新:

根据您更新的代码,您的问题在于如何定义主键...

这里有几个问题:

  1. 您已使用名称 PK 定义了主键列,则 primaryKey(0) = Inttable.Columns("Name")

这应该是primaryKey(0) = Inttable.Columns("PK")

  1. 您定义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/

相关文章:

vb.net - 即使在 VB2005 项目中添加 System.Management 引用后,仍未定义 ManagementObjectSearcher

vb.net - 禁用所有菜单项

vb.net - 将 DataGridView 中的一列设置为只读

c# - 如何从 DataGridView 中获取选中的对象?

.net - 如何使用 VB.NET 从 FTP 下载目录

vb.net - 如何在 vb .net 中获取文件句柄

c# - 使用自定义对象的动态列表并且不能动态更改 dataGrid 的单元格属性

javascript - DataTables - 如何使用自定义条件对列进行排序?

javascript - 如何使用数据表中的 columnef 函数在两个数据表列上禁用 xeditable?

python-3.x - 如何使用 Dash 在具有大型数据帧的数据表中提供分页