2013-10-01 3 views
0

Прежде всего позвольте мне сказать, что я видел подобные вопросы в StackOverflow, но ни один из них, который я видел, не имеет особого отношения к автогенерированным столбцам.Изменить порядок asp: GridView * autogenerated * columns

У меня есть asp:GridView, что я привязываю к IEnumerable<Data>, где Data может варьироваться в зависимости от времени выполнения. Тем не менее, каждый Data класс разделяет пару базовых свойства:

public class BaseData 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class AddressData : BaseData 
{ 
    public string Street1 { get; set; } 
    public string Street2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string ZipCode { get; set; }; 
} 

public class ContactData : BaseData 
{ 
    public string Phone { get; set; } 
    public DateTime LastUpdated { get; set; } 
    // tons more public properties... 
} 

// More classes with lots of different public properties... 

Эти различные классы населены запроса к базе данных, поэтому я хочу, чтобы автоматически создавать столбцы, когда я помещаю данные в GridView из-за большого количества разные поля. Тем не менее, я хочу сначала отобразить столбцы, которые находятся в общем базовом классе. Если я просто назначу IEnumerable<Data> источнику данных GridView, свойства базовых классов добавляются последними к столбцам GridView. Я попытался исправить положение, как это:

// Callback after getting data from database 
public void SetGridView<Data>(IEnumerable<Data> rows) where Data : BaseData 
{ 
    // Make sure these columns show up first 
    BoundField ID = new BoundField() { HeaderText = "ID", DataField = "ID" }; 
    BoundField Name = new BoundField() { HeaderText = "Name", DataField = "Name" }; 
    myGridView.Columns.Clear(); 
    myGridView.Columns.Add(ID); 
    myGridView.Columns.Add(Name); 
    myGridView.AutoGenerateColumns = true; 
    myGridView.DataSource = rows; 
    myGridView.DataBind(); 
} 

Однако, это просто дублирует столбцы в начале и в конце, так что заголовок выглядит следующим образом:

ID Name Street1 Street2 City State ZipCode ID Name 

Так есть ли способ для меня переместить столбцы, которые, как я знаю, будут там (базовый класс) в начало столбцов GridView, при этом все еще будет удобнее автогенерировать все остальные столбцы?

+0

Я думаю, что вызов SetGridView слишком велик в жизненном цикле страницы (viewstate + control tree). Может быть, вам стоит изучить это. – CharlesAD

+0

Я не думаю, что это было бы так, поскольку созданные столбцы создавались только тогда, когда данные доступны, и добавление связанных полей действительно работает, но это просто не позволяет процессу автогенерации генерировать одни и те же столбцы во второй раз. Я не понимаю, что вы имеете в виду? – hatch22

+0

Вы пытались изменить свой запрос в том порядке, в котором должны появляться столбцы? – Zerkey

ответ

1

Поскольку вы вынуждены использовать автогенерированные столбцы, я бы просто создал промежуточный DataTable, чтобы связать GridView. В этом объекте DataTable вы можете добавить свои столбцы в том порядке, в котором вы предпочитаете. Затем GridView привязывается в том же порядке.

Редактировать: Изменить BaseData, добавьте следующее:

private DataTable dataForDisplay; 

// This would be overridden by all child classes, adding their columns in the order you want 
public virtual DataTable GetDataForDisplay() 
{ 
    dataForDisplay = new DataTable(); 
    dataForDisplay.Columns.Add("ID"); 
    dataForDisplay.Columns.Add("Name"); 
    // If you want to change the order, just don't call the base.GetDataForDisplay() 

    dataForDisplay.Rows.AddRange(this.ID, this.Name); 

    return dataForDisplay; 
} 

Тогда все другие классы детей перекроет GetDataForDisplay().

+0

Проблема заключается в том, что я не знаю, какие столбцы нужно добавить до выполнения, и я бы предпочёл не устанавливать газиллинговые поля в DataTable и проверять каждый возможный подкласс Data, чтобы узнать, какие поля нужно установить. AutoGenerateColumns экономит много времени и усилий, мне просто нужны два столбца, которые, как я знаю, будут присутствовать во всех случаях, чтобы быть на переднем плане, а не в задней части коллекции колонок. – hatch22

+0

Но вы знаете столбцы, потому что они объявлены в пользовательском классе. Вы можете включить метод ConvertToDataTable() в каждом из ваших пользовательских классов. Вы даже можете сделать его частью базового класса, вызвать базовую реализацию, а затем добавить пользовательские столбцы, соответствующие свойствам вашего пользовательского класса. –

+0

Я знаю, что это вариант, это будет означать много работы и кажется ненужным. Я бы по сути копировал содержимое каждого класса в новую структуру данных, которая задает поля в том порядке, в котором я хочу. Я не понимаю, почему такое время, усилие и потерянная память должны быть необходимы, когда все, что я хочу сделать, это изменить порядок существующей структуры. – hatch22

Смежные вопросы