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

本文关键字:数据表 数据 数据网 显示 视图 网格 添加 | 更新日期: 2023-09-27 18:33:18

我有一个非常特殊的问题,但我会尽量清楚地解释。

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

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

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

我的数据可以有 2 个以上的矩阵,但这只是为了给出一个想法。

我想要实现的目标:

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

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

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

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

2(在上面的例子中,我必须手动添加一个任意值,比如第一个矩阵中所有速度行的0。

3(继续为我的所有矩阵执行此操作(必要时添加0(。最后也是简单的部分是设置数据网格视图的数据源:

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