gpt4 book ai didi

c# - 在单个 DataGridView 中显示来自多个 DataTable 的行

转载 作者:太空宇宙 更新时间:2023-11-03 15:48:33 24 4
gpt4 key购买 nike

我继承了多个具有不同列名的数据表,这些数据表目前都显示在它们自己的 DataGridView 中。我想创建一个新的附加 DataGridView,将它们全部显示在一个 DataGridView 中。例如(非常简化):

public class DataTableA: DataTable
{
public DataTableA()
{
this.Columns.Add("DateA", typeof(string));
this.Columns.Add("PriceA", typeof(string));
this.Columns.Add("SomeOtherFieldA", typeof(string));
}
}

public class DataTableB: DataTable
{
public DataTableB()
{
this.Columns.Add("DateB", typeof(string));
this.Columns.Add("PriceB", typeof(string));
this.Columns.Add("SomeOtherFieldB", typeof(string));
}
}

我想在新 DataGridView 中的单个列中显示 DataTableA.DateA 和 DataTableB.DateB 的值,并在单个列中显示 DataTableA.PriceA 和 DataTableB.PriceB 的值。我一直在探索制作一个通用的基类或接口(interface),但还没有太多运气。在不更改列名(不是一个选项)的情况下,是否可以创建一个能够在同一列中显示两者的绑定(bind)?

编辑:
不幸的是,我认为简单地将 DataTables 合并或聚合到一个新的 DataTable 中是行不通的,因为系统的设计使得 DataTableX 类(例如,DataTableA 和 DataTableB)中有逻辑来处理推送数据并更新相应的行数据表。

此外,我并没有尝试将多个 DataTable 中的 合并为一行,我试图在 DataGridView 的单个列中显示具有不同名称的多个列。例如,假设有这样的数据:

数据表A:

DateA       PriceA  SomeOtherFieldA20141118    2.0      a20141119    3.0      b

数据表B:

DateB       PriceB  SomeOtherFieldB20141118    4.0      c20141119    5.0      d

我想在 DataGridView 中显示以下内容:

Date        Price  20141118    2.0 20141119    3.0 20141118    4.0 20141119    5.0 

最佳答案

我最终使用了 Tarik 的技巧并将目标数据从原始源表复制到目标目标表,然后当源表被推送数据更新时,我更新目标表中的相应数据。下面是一些示例代码来展示我是如何做到的。

注意:在我的代码中,我将该过程称为将数据从源表“反射(reflect)”到目标表,因为在目标表中只是显示源表的反射(reflect)数据,不要与完全不相关的对象反射相混淆。

复制数据:

首先,我创建了字典以将源列名映射到目标表列名。 (目标列名称包含在一个列表中,因为我需要将单个源列复制到多个目标列 - 如果您不需要这样做,您可以只使用一个简单的字符串字典。)例如:

Dictionary<string, List<string>> reflectedColumnsMapA = new Dictionary<string, List<string>>()
{
{ "DateA", new List<string>() { "Date" }},
{ "PriceA", new List<string>() { "Price" }},
};

Dictionary<string, List<string>> reflectedColumnsMapB = new Dictionary<string, List<string>>()
{
{ "DateB", new List<string>() { "Date" }},
{ "PriceB", new List<string>() { "Price" }},
};

接下来我制作了一个字典,将原始源表行映射到目标表行,用于保持行同步。

Dictionary<DataRow, DataRow> sourceToTargetRowMap = new Dictionary<DataRow, DataRow>();

然后我做了一个方法,将数据从源表复制到目标表,同时填充源到目标行字典。

public void ReflectRowsToTable(DataTable sourceTable, DataTable targetTable, Dictionary<string, List<string>> reflectedColumnsMap)
{
foreach (DataRow originalRow in sourceTable.Rows)
{
DataRow newRow = targetTable.NewRow();

foreach (KeyValuePair<string, List<string>> keyValue in reflectedColumnsMap)
{
foreach (string targetColumn in keyValue.Value)
newRow[targetColumn] = originalRow[keyValue.Key];
}

sourceToTargetRowMap.Add(originalRow, newRow);
targetTable.Rows.Add(newRow);
}
}

保持数据同步:

最后,为了保持数据同步,我向所有源表添加了 ColumnChanged 事件处理程序:

sourceTable.ColumnChanged += (s, e) =>
{
// check if the updated column is one of the columns that were reflected
if (reflectedColumnsMap.ContainsKey(e.Column.ColumnName))
{
// get the target row corresponding to the updated row in the source table
DataRow reflectedRow = sourceToTargetRowMap[e.Row];
// update the corresponding columns in the target table
foreach (string targetColumn in reflectedColumnsMap[e.Column.ColumnName])
{
// update the value
reflectedRow[targetColumn] = e.Row[e.Column.ColumnName];
}
}
};

关于c# - 在单个 DataGridView 中显示来自多个 DataTable 的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26969252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com