VB.NET实现DataTable行添加至DataGridView及缺失Lab ID检测
解决方案
一、修复DataTable匹配行添加至DataGridView的问题
你之前的代码错误是因为Rows.Add()接收的是单行数据的数组,而非整个DataRowCollection对象,导致DGV把集合本身当成字符串显示。以下是正确实现:
1. 根据输入的Lab ID查找并添加匹配行
// 获取输入的Lab ID(假设输入控件为txtLabId) string inputLabId = txtLabId.Text.Trim(); if (string.IsNullOrEmpty(inputLabId)) return; // 在DataTable中定位匹配行 DataRow targetRow = GetResults.AsEnumerable() .FirstOrDefault(row => row["Lab ID"].ToString() == inputLabId); if (targetRow != null) { // 避免重复添加相同Lab ID的行 bool isDuplicate = dgScanned.Rows.Cast<DataGridViewRow>() .Any(row => row.Cells["Lab ID"].Value?.ToString() == inputLabId); if (!isDuplicate) { // 将匹配行的单元格数据数组添加到DGV dgScanned.Rows.Add(targetRow.ItemArray); } }
2. 从DataTable自动同步DGV列名
如果窗体加载时需要自动生成列(替代手动指定),可以在Form_Load事件中添加:
private void Form_Load(object sender, EventArgs e) { // 遍历DataTable列,生成对应DGV列 foreach (DataColumn col in GetResults.Columns) { dgScanned.Columns.Add(col.ColumnName, col.ColumnName); } }
若已手动指定DGV列,只需确保列名与DataTable的列名完全一致,即可自动映射数据。
二、找出DataTable中未添加到DGV的Lab ID
通过集合差集对比两边的Lab ID,实现缺失ID的检测:
// 提取DataTable中所有Lab ID var allLabIds = GetResults.AsEnumerable() .Select(row => row["Lab ID"].ToString()) .ToHashSet(); // 提取DGV中已存在的Lab ID(排除空行) var scannedLabIds = dgScanned.Rows.Cast<DataGridViewRow>() .Where(row => !row.IsNewRow) .Select(row => row.Cells["Lab ID"].Value?.ToString()) .Where(id => !string.IsNullOrEmpty(id)) .ToHashSet(); // 计算差集得到缺失的ID var missingIds = allLabIds.Except(scannedLabIds).ToList(); // 弹窗显示结果 if (missingIds.Any()) { MessageBox.Show("未添加的Lab ID:\n" + string.Join("\n", missingIds)); } else { MessageBox.Show("所有Lab ID已添加至DataGridView"); }
内容的提问来源于stack exchange,提问作者BrettFK
相关产品推荐
相关产品推荐

