【问题标题】:Add datatables with different or equal columns, to a master datatable and show that on datagridview将具有不同或相等列的数据表添加到主数据表并在 datagridview 上显示
【发布时间】:2016-02-05 10:30:41
【问题描述】:

我有一个很奇怪的问题,但我会尽量解释清楚。

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

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

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

我的数据可以有超过 2 个矩阵,但这只是提供一个想法。

我想要达到的目标:

在我所有的数据矩阵中,我想创建一个主数据表,然后将其传递给我的 datagridview'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;

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

【问题讨论】:

    标签: c# .net winforms datagridview datatable


    【解决方案1】:

    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
    

    【讨论】:

    • 问题是我的数据表可以带有不同数量的行。除非我要手动使它们在所有表之间相等。
    • 我认为 Dim foundRows() As DataRow = master.Select(xpression) 应该是 Dim foundRows() As DataRow = dt.Select(xpression) 但是,当我到达最后一个 foreach 时,没有foundRow[dc].ToString() 等于“NonExistent”。我不应该查看主数据表吗?
    • 是的,应该是:foundRow(dc.ColumnName).ToString = "NonExistent"。代码更新,试试看,应该可以了
    • 很遗憾,我不在我的笔记本电脑前,我明天会尝试拿到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多