移动RenderTable列

时间:2014-04-28 09:19:30

标签: c# componentone

我有一个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方法,但它对我不起作用,因为插入索引可能会改变。 是否有任何渲染表函数将列移动到指定的索引。

请提出任何替代方案。

2 个答案:

答案 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;
  }
}