嵌套For Next循环中DataTable、List<>与DataGridView使用问题求助
问题排查与修复方案
我帮你找出了代码里的几个关键问题,咱们一步步来解决:
核心错误分析
你的代码无法正确生成DataTable并展示,主要是三个逻辑问题导致的:
1. 重复使用同一个DataRow对象
你只在循环外创建了一次DataRow row = dt.NewRow();,之后所有采样都复用这个row对象。当你多次调用dt.Rows.Add(row)时,实际上是把同一个对象反复添加到DataTable中,后续对row的赋值会覆盖所有已添加行的内容,最终所有行的数据完全一致。
2. 循环嵌套逻辑错误
你在通道循环(chan循环)内部就调用了dt.Rows.Add(row),这会导致每个采样生成iAnaChan行(每个通道单独占一行),而不是每行对应一个采样的所有通道数据,完全不符合你想要的表格结构。
3. 采样值的索引逻辑不合理
你的SampledData类只定义了单个sSampleVal,但每个采样应该对应多个通道的数值!当前代码中frmMain.channeldata[sam-1].sSampleVal会让同一个采样的所有列都填充同一个值,这显然不符合业务需求。
修复后的完整代码
private void Form4_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); // 先添加所有模拟通道对应的列 for (int i = 0; i < frmMain.iAnaChan; i++) { dt.Columns.Add(frmMain.AnalogChannelList[i].ch_id.ToString()); } // 遍历每个采样,生成一行完整数据 for (int sam = 0; sam < frmMain.TotSamples; sam++) { DataRow row = dt.NewRow(); // 每个采样都要创建新的行对象,避免数据覆盖 for (int chan = 0; chan < frmMain.iAnaChan; chan++) { // 注意:这里需要根据你的实际数据结构调整索引逻辑 // 假设channeldata是[采样索引][通道索引]的二维结构 row[chan] = frmMain.channeldata[sam][chan].sSampleVal.ToString(); // 如果按下面的优化方案修改了SampledData类,应该写成: // row[chan] = frmMain.channeldata[sam].sSampleVals[chan].ToString(); } dt.Rows.Add(row); // 所有通道值赋值完成后,再将该行添加到DataTable } dataGridViewSampleData.DataSource = dt; }
额外优化建议:调整SampledData类结构
为了更合理地存储每个采样的多通道数据,建议把SampledData类修改为以下结构:
public class SampledData { public string sSampleNo { get; set; } public string sTimeStamp { get; set; } // 用列表存储当前采样的所有通道值,数量与iAnaChan对应 public List<string> sSampleVals { get; set; } = new List<string>(); }
这样你在赋值时,直接通过frmMain.channeldata[sam].sSampleVals[chan]就能拿到对应通道的采样值,逻辑会清晰很多。
内容的提问来源于stack exchange,提问作者ElectricRay81
相关产品推荐
相关产品推荐

