Moving the column of RenderTable

2019-01-15 21:32发布

I have a renderTable and I am adding rows and columns to the table as follows-

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
}

This is working fine and table is rendering as folllows-

Column 1    Column2   Column3    Column4
  10           11        12         13

My requirement is, now I want to move the column 4 to another place like 2nd place as follows . (this place can differ depending on condition)

Column 1    Column4   Column2    Column3
  10           13        11         12

I tried Insert method but it is not working for me as the insert index may change. Is there any function of render table to move the column to specified index.

Please suggest any alternative if any.

2条回答
该账号已被封号
2楼-- · 2019-01-15 22:19

We regret to mention but there isn't any function that can allow the moving of column of RenderTable to a specified index since the Cols of C1PrintDocument is ReadOnly.

查看更多
叼着烟拽天下
3楼-- · 2019-01-15 22:23

I've done this by creating a new class from System.Web.UI.WebControls.GridView. I override CreateColumns which is used to return an array of the column objects in order. I read a cookie from the page (this allows me to change the columns via a cookie on the page) and create a new column array based on the cookie. This cookie is just a string of the column names in the order required with a | separator. I had another column picker page that would set this cookie. If you don't need to change the columns with a cookie this is not needed -- you could read / create this string from a database or configuration file. I believe the code is well commented and clear -- one note, our application has a requirement to include hidden columns, so I add those to the end of the column list before I return the array.

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;
  }
}
查看更多
登录 后发表回答