将具有不同或相等列的数据表添加到主数据表中,并在数据网格视图上显示该数据表
本文关键字:数据表 数据 数据网 显示 视图 网格 添加 | 更新日期: 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