【问题标题】:Merge columns of different types from datatables into one larger datatable将数据表中不同类型的列合并到一个更大的数据表中
【发布时间】:2014-02-20 19:29:07
【问题描述】:

我有两个单独的数据表,一个是整数,一个是字符串。两者都是 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 数据网格视图,有时它保留一个数据表的值,但为第二个数据表的所有值放置空白。

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

【问题讨论】:

    标签: vb.net datagridview datatable merge


    【解决方案1】:

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


    更新:

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

    这里有几个问题:

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

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

    1. 你定义你的primaryKey数组如下:

      将 primaryKey(1) 作为数据列调暗

    应该是:

    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)
    

    希望这会有所帮助并且有意义!

    【讨论】:

    • 已经阅读了关于将列设置为主列的信息,但由于没有通用列,我希望有比所有数据修改更简单的方法。如果我是对的,只需添加一个循环遍历所有行的列就不是那么容易了吗?这些是示例表,我的 SQL 查询产生更大的数据网格视图
    • @user3334230,刚刚更新了我的答案 - 希望这能更好地解释它/对你有用......
    • 谢谢。我是个白痴,从未意识到我使用的是Name 而不是PK
    • 我知道合并,但我缺少主键部分。谢谢!
    【解决方案2】:

    使用 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
    

    【讨论】:

      猜你喜欢
      • 2019-09-09
      • 1970-01-01
      • 2017-06-27
      • 2018-10-28
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      相关资源
      最近更新 更多