2012-01-23 26 views
6

类似的问题可能存在,但它们都不是很有帮助。所以我会试着解释一个更具体的例子,看看有没有人可以帮我:)如何动态重新排列gridview中的列

这是事情,我有一个gridview与templatefields,我想让用户指定顺序那些列被显示。所以,用户创建一个视图并决定首先显示哪一列,第二个等等。

所以基本上,我需要改变网格加载数据后的列顺序。

听起来容易吧?好吧,显然不是。至少我还没有达到那个目标。

一些注意事项: - 当然我有AutogenerateColumns设置为false。 - 由于之前的项目,更改sql select列顺序将不起作用。 - 我不想通过代码生成列。

任何想法?

+0

以下是如何动态重新排列列:http://stackoverflow.com/a/28611217/215752 – Hogan

回答

18

您可以在代码隐藏中修改Gridview的Columns集合。因此,这样做的一种方式是从列中当前位置移除列,然后将其重新插入新位置。

例如,如果你想移动的第二列是第一列,你可以这样做:

var columnToMove = myGridView.Columns[1]; 
myGridView.Columns.RemoveAt(1); 
myGridView.Columns.Insert(0, columnToMove); 

如果你需要将它们周围随机移动,那么你可能想尝试克隆实地收集,清除集合中的GridView控件,然后重新插入他们都在为了你希望他们英寸

var columns = myGridView.Columns.CloneFields(); 
myGridView.Columns.Clear(); 
myGridView.Columns.Add(columns[2]); 
myGridView.Columns.Add(columns[0]); 
etc.. 

我不是100%肯定这是否会全部下班后绑定到数据,所以除非有理由不这样做,否则我会在Page_Init或bindin之前的某个位置执行此操作G。

+0

这很好!但只有一件事......我在该网格上有一个按钮,我在OnRowCommand事件中应用了一些逻辑。那么,现在,在行被重新排序之后,该方法从未被执行,并且一些列在我点击按钮后是空的... – Ragalante

+0

我发现使用'myGridView.Columns.CloneFields();'产生一个克隆所有列对象也是这样(这可能是一个问题)。例如,如果您有自己的自定义列继承自“BoundField”,那么它会将您的对象克隆为“BoundField”。要解决这个问题,请执行:'myGridView.Columns.OfType ()。ToList();'因为这只会创建一个新的集合,同时保持对原始列对象的引用。 –