为何克隆后的DataTable数据行无法在WPF DataGrid中显示?
DataTable数据复制失败问题解决
问题根源
你用dt.Clone()创建clonedDT时,只会复制DataTable的列结构,不会复制任何数据行。后续调用CopyColumns遍历clonedDT.Rows时,因为clonedDT是空的,自然没有数据能复制到clonedDT2,最终DataGrid只显示列头。而用原始dt正常,是因为dt是从Excel读取的,本身包含完整数据行。
解决方案
需要先把原始dt的数据转换后导入clonedDT(因为修改了列类型,直接导入会报错),再进行后续的列筛选操作。
修正后的完整代码
Private Sub AgrestLoadXL() Dim dt As System.Data.DataTable = ReadDataExcel(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "FlANGEDATA6.xls")) Dim clonedDT As System.Data.DataTable = dt.Clone ' 修改各列数据类型 clonedDT.Columns("NB ('')").DataType = GetType(Double) clonedDT.Columns("NB (mm)").DataType = GetType(Double) clonedDT.Columns("STD").DataType = GetType(String) clonedDT.Columns("RATING").DataType = GetType(String) clonedDT.Columns("OD").DataType = GetType(Double) clonedDT.Columns("PCD").DataType = GetType(Double) clonedDT.Columns("No Bolts").DataType = GetType(Double) clonedDT.Columns("Thk Steel").DataType = GetType(Double) clonedDT.Columns("RF Dia").DataType = GetType(Double) clonedDT.Columns("RTJ RF Dia").DataType = GetType(Double) clonedDT.Columns("RF DIP").DataType = GetType(Double) clonedDT.Columns("RTJ DIP").DataType = GetType(String) clonedDT.Columns("RF Height").DataType = GetType(Double) clonedDT.Columns("RF RTJ Height").DataType = GetType(Double) clonedDT.Columns("Hole Size").DataType = GetType(String) clonedDT.Columns("Bolt Metric").DataType = GetType(String) clonedDT.Columns("Bolt Inch").DataType = GetType(String) clonedDT.Columns("Ring type & Size").DataType = GetType(String) clonedDT.Columns("RF").DataType = GetType(Double) clonedDT.Columns("RTJ").DataType = GetType(Double) clonedDT.Columns("RTJRing Gap").DataType = GetType(String) clonedDT.Columns("Thk Iron").DataType = GetType(String) clonedDT.Columns("PipeOD").DataType = GetType(Double) ' 关键步骤:将原始dt的数据转换类型后导入clonedDT For Each sourceRow As DataRow In dt.Rows Dim newRow As DataRow = clonedDT.NewRow() For Each col As DataColumn In clonedDT.Columns ' 处理空值,避免转换报错 If sourceRow(col.ColumnName) Is DBNull.Value Then newRow(col.ColumnName) = DBNull.Value Else ' 转换数据类型以匹配clonedDT的列定义 newRow(col.ColumnName) = Convert.ChangeType(sourceRow(col.ColumnName), col.DataType) End If Next clonedDT.Rows.Add(newRow) Next ' 生成仅包含指定列的clonedDT2(自动包含数据行,无需手动复制) Dim clonedDT2 As System.Data.DataTable = clonedDT.DefaultView.ToTable(True, "NB ('')", "RATING", "STD") WPFinstance.myDataGrid.DataContext = clonedDT2 REDDATA = WPFinstance.myDataGrid.DataContext ALLDATA = clonedDT End Sub
额外优化说明
clonedDT.DefaultView.ToTable(True, 列名)方法本身会根据视图生成包含数据行的新表,所以不需要再调用自定义的CopyColumns方法,简化了代码逻辑。
内容的提问来源于stack exchange,提问作者Agrestor
相关产品推荐
相关产品推荐

