You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将4个同结构DataSet合并至单个DataGridView?

如何合并4个同结构DataSet并显示到DataGridView?

首先得说,你现在的合并逻辑走偏啦——新建四个空的DataSet互相合并,根本没用到你辛苦获取到的真实数据,自然看不到结果😅。咱们来调整一下思路,用正确的方式合并这四个DataSet,然后绑定到DataGridView。

需求回顾

你需要把4个结构完全一致的DataSet中的数据合并到一起,最终在DataGridView中展示成类似这样的格式:

terminal_name jan feb march april may

(dataset1) terminal A 100 200 300 500 700
(dataset2) Counter2 50 120 320 780 600
(dataset3) ABC 90 12 45 78 60
(dataset4) XYZ X X X X X

现有代码(获取DataSet部分是对的)

你已经正确获取了四个目标DataSet:

dgvReport.Rows.Clear();
DataSet dsResult = objWSX.SelectTopUpReportByCounter(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult2 = objWSX.SelectHUGOOnlineTopUpSummary(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult3 = objWSX.SelectManjalinkTopUpSummary(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult4 = objWSX.SelectReloadCardTopupSummary(AYear, optCurrency.SelectedValue.ToString());

但你尝试的合并代码没有利用这些获取到的数据集,所以无法得到结果。下面给你两种可行的解决方案:


方案一:合并DataTable到统一表(推荐)

这种方式更直观,直接操作DataTable来合并数据:

// 清空DataGridView现有行(可选,设置DataSource时会自动刷新)
dgvReport.Rows.Clear();

// 获取四个数据集(这部分保留你的原有代码)
DataSet dsResult = objWSX.SelectTopUpReportByCounter(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult2 = objWSX.SelectHUGOOnlineTopUpSummary(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult3 = objWSX.SelectManjalinkTopUpSummary(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult4 = objWSX.SelectReloadCardTopupSummary(AYear, optCurrency.SelectedValue.ToString());

// 创建空的目标DataTable,复制第一个数据集的表结构(假设每个DataSet只有1个DataTable)
DataTable mergedTable = new DataTable();
if (dsResult.Tables.Count > 0)
{
    mergedTable = dsResult.Tables[0].Clone(); // 仅复制结构,不复制数据
}

// 依次将每个DataSet的DataTable数据导入到目标表
AddTableData(mergedTable, dsResult);
AddTableData(mergedTable, dsResult2);
AddTableData(mergedTable, dsResult3);
AddTableData(mergedTable, dsResult4);

// 绑定合并后的表到DataGridView
dgvReport.DataSource = mergedTable;

// 辅助方法:将DataSet中的数据行导入目标表
private void AddTableData(DataTable targetTable, DataSet sourceDs)
{
    // 校验数据源是否有效
    if (sourceDs?.Tables.Count == 0 || sourceDs.Tables[0].Rows.Count == 0)
        return;

    foreach (DataRow row in sourceDs.Tables[0].Rows)
    {
        targetTable.ImportRow(row); // 导入行,自动匹配结构
    }
}

方案二:使用DataSet.Merge方法(正确用法)

如果你想用DataSet的Merge方法,要确保合并的是有数据的DataSet,而不是空的:

dgvReport.Rows.Clear();

// 获取四个数据集(保留原有代码)
DataSet dsResult = objWSX.SelectTopUpReportByCounter(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult2 = objWSX.SelectHUGOOnlineTopUpSummary(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult3 = objWSX.SelectManjalinkTopUpSummary(AYear, optCurrency.SelectedValue.ToString());
DataSet dsResult4 = objWSX.SelectReloadCardTopupSummary(AYear, optCurrency.SelectedValue.ToString());

// 初始化合并用的DataSet,先复制第一个表的结构
DataSet mergedDs = new DataSet();
if (dsResult.Tables.Count > 0)
{
    mergedDs.Tables.Add(dsResult.Tables[0].Clone());
    mergedDs.Merge(dsResult); // 合并第一个数据集的数据
}

// 依次合并剩下的三个数据集
mergedDs.Merge(dsResult2);
mergedDs.Merge(dsResult3);
mergedDs.Merge(dsResult4);

// 绑定到DataGridView
dgvReport.DataSource = mergedDs.Tables[0];

关键注意事项

  • 必须保证四个DataSet中的DataTable结构完全一致(列名、数据类型、顺序都要匹配),否则合并时会抛出异常。
  • 如果你的DataSet包含多个DataTable,需要指定具体的表名或索引,示例中默认每个DataSet只有1个DataTable。
  • 不需要手动遍历添加列,Clone()和Merge()会自动处理结构匹配。

内容的提问来源于stack exchange,提问作者nur wahidah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:21:38