Перемещение столбца 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
}

Это работает нормально, и таблица отображается следующим образом:

Column 1    Column2   Column3    Column4
  10           11        12         13

Мое требование: теперь я хочу переместить столбец 4 в другое место, например на 2-е место, следующим образом. (это место может отличаться в зависимости от состояния)

Column 1    Column4   Column2    Column3
  10           13        11         12

Я попробовал метод Insert, но он у меня не работает, так как индекс вставки может измениться. Есть ли какая-либо функция таблицы рендеринга для перемещения столбца в указанный индекс.

Пожалуйста, предложите любую альтернативу, если таковая имеется.


person Microsoft DN    schedule 28.04.2014    source источник


Ответы (2)


Мы сожалеем об этом, но нет никакой функции, которая позволяет перемещать столбец RenderTable в указанный индекс, поскольку столбцы C1PrintDocument доступны только для чтения.

person Mohita    schedule 26.08.2014

Я сделал это, создав новый класс из 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;
  }
}
person Hogan    schedule 19.02.2015