2014-04-28 40 views
1

的專欄中,我有一個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 
} 

添加的行和列的表這是工作的罰款,並表被渲染爲folllows-

Column 1 Column2 Column3 Column4 
    10   11  12   13 

我的要求是,現在我想把第4列移到第二個地方的另一個地方,如下所示。 (這個地方可以根據條件不同)

Column 1 Column4 Column2 Column3 
    10   13  11   12 

我試過插入方法,但它不適合我,因爲插入索引可能會改變。 有渲染表的任何功能將列移動到指定的索引。

請提出任何替代方案(如有)。

回答

1

我們遺憾地提到,但是由於C1PrintDocument的Cols是ReadOnly,所以沒有任何可以允許將RenderTable的列移動到指定索引的函數。

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