移动RenderTable列

我有一个renderTable,我正在向表中添加行和列,如下所示 –

RenderTable renderTable = new RenderTable(); DataTable dt = GetData(); foreach (DataRow row in dt.Rows) { var header = renderTable.Rows[renderTable.Rows.Count]; header[0].Text = "Column 1"; header[1].Text = "Column 2"; header[2].Text = "Column 3"; header[1].Text = "Column 4"; var data = renderTable.Rows[renderTable.Rows.Count]; data [0].Text = row["col1"].ToString(); // 10 data [1].Text = row["col2"].ToString(); // 11 data [2].Text = row["col3"].ToString(); // 12 data [3].Text = row["col4"].ToString(); // 13 } 

这工作正常,表格呈现为以下 –

 Column 1 Column2 Column3 Column4 10 11 12 13 

我的要求是,现在我想将第4列移动到第二个位置,如下所示。 (这个地方因条件而异)

 Column 1 Column4 Column2 Column3 10 13 11 12 

我尝试了Insert方法,但它不适合我,因为插入索引可能会改变。 是否有任何渲染表函数将列移动到指定的索引。

如果有的话,请提出任何其他建

我们遗憾地提到但是由于C1PrintDocument的Cols是ReadOnly,因此没有任何函数可以允许将RenderTable列移动到指定的索引。

我是通过从System.Web.UI.WebControls.GridView创建一个新类来完成的。 我重写CreateColumns,它用于按顺序返回列对象的数组。 我从页面读取了一个cookie(这允许我通过页面上的cookie更改列)并根据cookie创建一个新的列数组。 这个cookie只是一个字符串的字符串,所需的顺序为| 分隔器。 我有另一个列选择器页面,可以设置这个cookie。 如果您不需要使用cookie更改列,则不需要 – 您可以从数据库或配置文件中读取/创建此字符串。 我相信代码已经很好地评论和清楚 – 一个注意,我们的应用程序需要包含隐藏列,所以我在返回数组之前将它们添加到列列表的末尾。

 using System.Collections; using System.Linq; using System.Web.UI.WebControls; public class ChangeColumnGridView : System.Web.UI.WebControls.GridView { protected override ICollection CreateColumns(PagedDataSource dataSource, bool useDataSource) { // Get the needful from the base class var baseColList = base.CreateColumns(dataSource, useDataSource); var inColList = baseColList.OfType(); // Get our column order string columnOrder; if (Page.Request.Cookies["colOrder"] != null) columnOrder = Page.Request.Cookies["colOrder"].Value; else return baseColList; // change it to an array string[] columnOrderA = columnOrder.Split(new char[] { '|' }); // this is where we will put our results ArrayList newColumnList = new ArrayList(); // look for each name in the list and add when we find it. foreach (string name in columnOrderA) { var found = inColList.Where((c) => c.ToString() == name).FirstOrDefault(); if (found != null) newColumnList.Add(found); } // look for non-visible items in the list and add them if we don't already have them. foreach (var a in inColList) { if (((System.Web.UI.WebControls.DataControlField)a).Visible == false) { var found = newColumnList.Cast().Where((c) => c.ToString() == a.ToString()).FirstOrDefault(); if (found == null) newColumnList.Add(a); } } return newColumnList; } }