繁体   English   中英

将具有不同或相等列的数据表添加到主数据表,并在datagridview上显示该数据表

[英]Add datatables with different or equal columns, to a master datatable and show that on datagridview

我有一个非常特殊的问题,但我会尽力解释得尽可能清楚。

我的矩阵可能具有不同的列,但也肯定会有一些相同的列。 这是一个例子:

矩阵1列:块号| 角度 扭力

矩阵2列:块号| 角度 扭矩| 速度

我的数据可以有两个以上的矩阵,但这只是一个想法。

我想实现的目标:

在所有数据矩阵中,我想创建一个主数据表,然后将其传递给我的datagridvie'w数据源。 但是,这并不像添加数据那么简单,因为对于上面的示例,我想知道Speed列属于第二个矩阵,例如,当我过滤速度时,我从第二个矩阵中获取行。

我的第一个主意如下:1)从第一个数据矩阵开始,读取所有列名,仅使用这些列名创建一个新的数据表:

DataTable Master = new DataTable();
Master.Columns.Add("Block Number");
Master.Columns.Add("Angle");
Master.Columns.Add("Torque");

然后开始读取第一个矩阵的数据,然后将名称等于我的主数据表列名称的任何列追加行。

2)在上面的示例中,我将不得不手动添加一个任意值,对于第一个矩阵中的Speed的所有行都说0。

3)继续对所有矩阵进行此操作(必要时添加0)。 最后也是最简单的部分是设置datagridview的数据源:

dataGridView1.DataSource = Master;

您是否认为这是解决此问题的好方法? 有更有效的替代方法吗?

VB.net-经过测试
我会做同样的事情。
但是,有些要点:您必须确保所有数据表具有相同数量的行,并且(例如)dt1的第50行与dt2的第50行相对应。 如果不是这样,则在每个表中都需要唯一键,并且在将值添加到行时使用更复杂的查找功能。
更新:使用唯一键,不再基于索引。 当然会使代码复杂化...
在下面的代码中,我假设块号+角度在所有表中均构成唯一值

    Dim dt1 As New DataTable
    dt1.Columns.Add(New DataColumn("A", GetType(System.String)))
    dt1.Columns.Add(New DataColumn("B", GetType(System.String)))
    dt1.Columns.Add(New DataColumn("C", GetType(System.String)))
    For index = 1 To 5
        Dim nr As DataRow = dt1.NewRow
        nr("A") = index
        nr("B") = 10 + index
        nr("C") = "DT1 C value" //Guid.NewGuid.ToString
        dt1.Rows.Add(nr)
    Next

    Dim dt2 As New DataTable
    dt2.Columns.Add(New DataColumn("A", GetType(System.String)))
    dt2.Columns.Add(New DataColumn("B", GetType(System.String)))
    dt2.Columns.Add(New DataColumn("C", GetType(System.String)))
    dt2.Columns.Add(New DataColumn("D", GetType(System.String)))
    For index = 3 To 7
        Dim nr As DataRow = dt2.NewRow
        nr("A") = index
        nr("B") = 10 + index
        nr("C") = "DT2 C Value" //Guid.NewGuid.ToString
        nr("D") = "DT2 value"
        dt2.Rows.Add(nr)
    Next

    Dim master As New DataTable

    Dim DTlist As New List(Of DataTable)
    DTlist.Add(dt1)
    DTlist.Add(dt2)
    //add all your datatables...
    For Each dt As DataTable In DTlist
        //add the column if needed
        For Each dc As DataColumn In dt.Columns
            If master.Columns.Contains(dc.ColumnName) Then
                Continue For
            Else
                Dim newColumn As New Data.DataColumn(dc.ColumnName, GetType(System.String))
                newColumn.DefaultValue = "NonExistent"
                master.Columns.Add(newColumn)
            End If
        Next
        // add the values
        For Each dr As DataRow In dt.Rows
            Dim xpression As String = String.Format("A = {0} AND B = {1}", dr("A"), dr("B"))
            Dim foundRows() As DataRow = master.Select(xpression)
            If foundRows.Count = 0 Then
                // add a new datarow to the master
                // value = NonExistent if it//s a datacolumn from the master, that isn//t in the current datatable
                Dim newRow As DataRow = master.NewRow
                For Each dc As DataColumn In master.Columns
                    If dt.Columns.Contains(dc.ColumnName) Then
                        newRow(dc.ColumnName) = dr(dc.ColumnName)
                    Else
                        newRow(dc.ColumnName) = "NonExistent"
                    End If
                Next
                master.Rows.Add(newRow)
            Else
                // add values to the existing rows
                For Each foundRow As DataRow In foundRows
                    For Each dc As DataColumn In dt.Columns
                        If foundRow(dc.ColumnName).ToString = "NonExistent" Then
                            foundRow(dc.ColumnName) = dr(dc)
                        End If
                    Next
                Next
            End If
        Next
    Next

    DataGridView1.DataSource = master

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM