我试图通过将DataTable
和DataTable
个选项传递给函数来重新排序Dictionary
中的列,类似于此线程的答案中所述。 / p>
以下是我正在使用的代码:
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
之前,我尝试重新排序列。
答案 0 :(得分:3)
你这么做很难。而不是重新构建缓慢且容易出错的表,而是为表创建一个DataView,其中包含您需要的列。该MSDN链接末尾的示例代码应该会有所帮助。
另请参阅本答案中建议的DataColumn.SetOrdinal()
:
答案 1 :(得分:0)
此方法根据需要对列重新排序。
正如@Sam Makin所建议的那样,在OpenXML中发现了丢失数据列的问题。
为了解决这个问题,我将DataTable中的第一列锁定到第一个位置,不允许它成为呈现给用户的重新排序过程的一部分。其余列将落入用户所需的任何顺序,但第一列将始终是第一列,因为它包含任何"标题"所需的数据。单元格在OpenXML流程中合并。
为实现此目的,将获取第一列订单值的文本框转换为标签并设置为1.