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

为何克隆后的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:34:55