我有一个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方法,但它对我不起作用,因为插入索引可能会改变。 是否有任何渲染表函数将列移动到指定的索引。
请提出任何替代方案。
答案 0 :(得分:1)
我们遗憾地提到但是由于C1PrintDocument的Cols是ReadOnly,因此没有任何函数可以允许将RenderTable列移动到指定的索引。
答案 1 :(得分:0)
我通过从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<object>();
// 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<object>().Where((c) => c.ToString() == a.ToString()).FirstOrDefault();
if (found == null)
newColumnList.Add(a);
}
}
return newColumnList;
}
}