VB.NET - 重新排序DataTable中的列会丢失一些数据

时间:2014-04-09 13:37:50

标签: vb.net datatable

我试图通过将DataTableDataTable个选项传递给函数来重新排序Dictionary中的列,类似于此线程的答案中所述。 / p>

DataTable column reorder

以下是我正在使用的代码:

Private Function ReorderColumns(dt As DataTable, options As
Dictionary(Of String, Object)) As DataTable

    Dim orderList = New System.Collections.Generic.Dictionary(Of String, String)

    For Each item In options
        orderList.Add(item.Key, GetOptionValue(options(item.Key), "Order", Int32.MaxValue).ToString())
    Next

    'May be some untested regex characters that need to be added.         
    For Each item In orderList.ToList()
        If String.IsNullOrEmpty(item.Value) Or Not IsNumeric(item.Value) Or Regex.IsMatch(item.Value, "[$.,]") Then
            orderList(item.Key) = Int32.MaxValue.ToString()
        End If
    Next

    Dim colOrd = orderList.OrderBy(Function(x) Convert.ToInt32(x.Value)).ToList()

    For Each lkey In colOrd
        For i As Integer = 0 To dt.Columns.Count - 1
            If dt.Columns(i).ColumnName.Equals(lkey.Key) Then
                dt.Columns(i).SetOrdinal(lkey.Value - 1)
                Exit For
            End If
        Next
    Next

    Return dt
End Function

根据需要进行重新排序。问题是,返回DataTable时,某些列中没有数据。

我认为我非常接近,因为这些列正在重新排序。感觉问题可能出在这一行:

dt.Columns(i).SetOrdinal(lkey.Value - 1)

需要能够为MS Word报告重新排序列。 DataTable是通过OpenXML构建报告的流程发送的。事实上,大多数所需数据都会在构建文档时显示出来。它只在已合并单元格的行上不再出现ColumnTitle(它用于遍历整个文档,现在它是空白的)。

现有代码从DataTable生成报告就好了。因此,在通过常规流程发送DataTable之前,我尝试重新排序列。

2 个答案:

答案 0 :(得分:3)

你这么做很难。而不是重新构建缓慢且容易出错的表,而是为表创建一个DataView,其中包含您需要的列。该MSDN链接末尾的示例代码应该会有所帮助。

另请参阅本答案中建议的DataColumn.SetOrdinal()

  

How to change DataTable columns order

答案 1 :(得分:0)

此方法根据需要对列重新排序。

正如@Sam Makin所建议的那样,在OpenXML中发现了丢失数据列的问题。

为了解决这个问题,我将DataTable中的第一列锁定到第一个位置,不允许它成为呈现给用户的重新排序过程的一部分。其余列将落入用户所需的任何顺序,但第一列将始终是第一列,因为它包含任何"标题"所需的数据。单元格在OpenXML流程中合并。

为实现此目的,将获取第一列订单值的文本框转换为标签并设置为1.