如何将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
相关产品推荐
相关产品推荐

