c# - 更改 UltraWinGrid 列的顺序

标签 c# datatable infragistics ultrawingrid

我的表单中有一个 UltraWinGrid,用户允许更改它的列顺序。我的表单中还有一个按钮,它应该将此网格的数据源作为数据表发送到生成报告的类。 我使用以下代码将 DataSource 转换为 DataTable:

(DataTable)UltraGrid1.DataSource

但问题是这个新DataTable中列的顺序不是用户设置的可见顺序... 我怎样才能将 UltraWinGrid 的数据源更改为我现在可以在屏幕上的网格中看到的内容?

最佳答案

WinGrid 数据源 包含显示网格时分配给该属性的相同对象。
如果您的用户通过 WinGrid 界面更改列的顺序或可见性,则底层数据源不受影响
我想到的唯一解决方案(对于大表来说非常昂贵)是 DataTable Copy() 方法来获取要处理的不同表,然后循环遍历grid.DisplayLayout.Band[0].Columns 并对隐藏在网格上的列 (Column.Hidden) 使用复制的 DataTable Remove() 方法。
棘手的部分是列的顺序。
DataColumn 提供了SetOrdinal 方法来更改列的顺序,但是,我想您需要从索引零向上开始调用此方法。因此,您需要使用 Column.Header.VisiblePosition 属性在网格列上进行另一个循环。
但现在还有其他问题:
首先 - 必须删除 DataTable PrimaryKey,因为如果隐藏,会阻止 Remove() 方法
其次 - VisiblePosition 索引不能连续,如果在 SetOrdinal 中使用可能指向超出范围的项目。

所以让我们总结一下这个示例代码中的所有内容:(需要 Collection.Generics 和 Linq)

Dictionary<int, string> gPos = new Dictionary<int,string>();
DataTable dtCopy = (grid.DataSource as DataTable).Copy();
dtCopy.PrimaryKey = null;
foreach(UltraGridColumn gCol in grid.DisplayLayout.Bands[0].Columns)
{
    if(gCol.Hidden == true)
        dtCopy.Columns.Remove(gCol.Key);
    else
      gPos.Add(gCol.Header.VisiblePosition, gCol.Key);
}
var list = gPos.Keys.ToList();
list.Sort();
int realPos = 0;
foreach (var key in list)
{
    dtCopy.Columns[gPos[key]].SetOrdinal(realPos++);
}

关于c# - 更改 UltraWinGrid 列的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9257069/

相关文章:

c# - 如何从 Microsoft CRM 中的 Guid 查找客户实体逻辑名称

c# - 如何使用 Rfc2898DeriveBytes 解密以下函数字符串?

c# - ASP.Net GridView RowUpdate 未触发且 RowUpdating 没有 NewValues

jquery - Datatable:日期/时间排序插件未排序

c# - 类型 universe 无法解析 WP7 项目中的程序集

c# - 以 block 的形式枚举 DataTable

javascript - 包含 js 文件时,CSS 不适用

c# - WPF Infragistics XamDataGrid 窃取滚动焦点

wpf - Infragistics XamDataGrid AllowEdit 属性绑定(bind)不起作用

c# - 不允许在查询中显式构造实体类型 'Artist'