2014-04-28 7 views
1

J'ai un renderTable et je suis en ajoutant des lignes et des colonnes à la table comme suit-Déplacement de la colonne de 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 
} 

Cela fonctionne bien et la table est rendu comme folllows-

Column 1 Column2 Column3 Column4 
    10   11  12   13 

Ma condition est, maintenant je veux déplacer la colonne 4 à un autre endroit comme la deuxième place comme suit. (Ce lieu peut varier selon la condition)

Column 1 Column4 Column2 Column3 
    10   13  11   12 

J'ai essayé la méthode d'insertion, mais il ne fonctionne pas pour moi comme l'indice d'insertion peut changer. Existe-t-il une fonction de la table de rendu pour déplacer la colonne vers l'index spécifié.

S'il vous plaît suggérer toute alternative le cas échéant.

Répondre

1

Nous regrettons de mentionner mais il n'y a aucune fonction qui peut permettre le déplacement de la colonne de RenderTable à un index spécifié puisque le Cols de C1PrintDocument est ReadOnly.

0

Je l'ai fait en créant une nouvelle classe à partir de System.Web.UI.WebControls.GridView. Je substitue CreateColumns qui est utilisé pour retourner un tableau des objets de colonne dans l'ordre. J'ai lu un cookie de la page (cela me permet de changer les colonnes via un cookie sur la page) et de créer un nouveau tableau de colonnes basé sur le cookie. Ce cookie est juste une chaîne de noms de colonnes dans l'ordre requis avec un séparateur |. J'avais une autre page de sélecteur de colonne qui définirait ce cookie. Si vous n'avez pas besoin de changer les colonnes avec un cookie, cela n'est pas nécessaire - vous pouvez lire/créer cette chaîne à partir d'une base de données ou d'un fichier de configuration. Je crois que le code est bien commenté et clair - une note, notre application a une obligation d'inclure des colonnes cachées, donc je les ajoute à la fin de la liste des colonnes avant de retourner le tableau.

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