首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改UltraWinGrid的列顺序

更改UltraWinGrid的列顺序
EN

Stack Overflow用户
提问于 2012-02-13 15:45:21
回答 2查看 6K关注 0票数 2

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

代码语言:javascript
复制
(DataTable)UltraGrid1.DataSource

但问题是,这个新DataTable中的列顺序并不是用户设置的可见顺序……如何将UltraWinGrid的DataSource更改为现在屏幕上的网格中可以看到的内容??

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-19 17:49:47

显示网格时,WinGrid 数据源包含分配给该属性的相同对象。

如果用户通过WinGrid接口更改列的顺序或可见性,则根本不会影响底层数据源。

我想到的唯一解决方案(对于大型表来说非常昂贵)是使用DataTable ()方法来获得另一个要处理的表,然后循环遍历该表,并对网格上隐藏的列使用复制的DataTable Remove()方法(Column.Hidden)。

棘手的部分是列的顺序。

DataColumn提供了SetOrdinal方法来更改列的顺序,但是,我认为您需要从索引0开始向上调用此方法。因此,您需要使用Column.Header.VisiblePosition属性在网格列上执行另一个循环。

但现在还有其他问题:

First -必须删除DataTable PrimaryKey,因为如果隐藏,将阻止使用Remove()方法

Second - VisiblePosition索引不能是连续的,如果在SetOrdinal中使用,则可能指向超出范围的项。

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

代码语言:javascript
复制
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++);
}
票数 0
EN

Stack Overflow用户

发布于 2012-02-15 13:47:10

您可以遍历列,然后使用Header.VisiblePosition属性来确定列的顺序。一旦确定了顺序,就需要在DataTable中设置适当的顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9257069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档