Порядок полей в динамических данных?

Кто-нибудь знает, возможно ли выбрать порядок полей в динамических данных (конечно, без настройки шаблонов для каждой таблицы)?

Спасибо!

Ответ 1

В .NET 4.0, используя версию dll Dynamic Data 4.0, вы можете установить аннотации данных так:

[Display(Name = " Mission Statement", Order = 30)]
public object MissionStatement { get; set; }

[Display(Name = "Last Mod", Order = 40)]  
public object DateModified { get; private set; }

Ответ 2

По этот поток - вы можете использовать ColumnOrderAttribute в dll динамических данных фьючерсов. Вы можете захватить фьючерсы из кода.

Ответ 3

Это можно сделать, изменив порядок открытых свойств в файле LINQ to SQL.

Например, я поступил в Northwind.designer.cs, который был моим автоматически сгенерированным LINQ to SQL файлом, и переместил общедоступное свойство "Продукты" выше общедоступного свойства CategoryName в public partial class Category. Затем я перекомпилировал и шаблон по умолчанию отобразил столбцы в моем новом порядке.

Конечно, это означает, что вы редактируете автоматически сгенерированный код, и если вы его регенерируете, ваши изменения будут потеряны, поэтому этот метод не без риска.

Ответ 4

Вам нужно создать пользовательскую страницу в папке DynamicData.

Вот шаги:

  • Создайте папку с тем же именем, что и имя вашей таблицы, которое вы хотите настроить порядок столбцов в папке DynamicData\CustomPages.
  • Создайте пользовательскую страницу в папке DynamicData\CustomPages\[папка с именем таблицы].
    • Я просто скопирую существующий файл "List.aspx" из "DynamicData\PageTemplates" в папку выше.
  • Откройте файл aspx и измените элемент управления GridView на "AutoGenerateColumns =" false "
  • В разделе "Внутренние столбцы" GridView добавьте элементы управления DynamicControl с атрибутом "DataField" к имени вашего столбца в том порядке, в котором вы хотите.

Вот скринкаст от ScottHa: http://www.asp.net/learn/3.5-SP1/video-293.aspx

Ответ 5

GridView обладает свойством ColumnsGenerator, используя его, используя метод GenerateFields интерфейса IAutoFieldGenerator, в котором вы можете задать порядок полей на основе ваших пользовательских правил (атрибутов, метаинформации и т.д.)

protected override void OnInit(EventArgs e)
{
    ...
    this.gvItemsList.ColumnsGenerator = new EntityFieldsGenerator(CurrentDataSource.CurrentTableMetadata);
    ...
}

public class EntityFieldsGenerator : IAutoFieldGenerator {
...
public ICollection GenerateFields(Control control)    
{
    // based on entity meta info
    var fields = from item in this.entityMetadata.Columns
                 where this.IncludeColumn(item.Value)
                 orderby item.Value.Order
                 select new DynamicField
                 {
                     DataField = item.Value.Column.Name,
                     HeaderText = item.Value.DisplayName,
                     DataFormatString = item.Value.DataFormatString,
                     UIHint = GetColumnUIHint(item.Value)
                 };
    return fields.ToList();
} }

Ответ 6

Чтобы избежать использования dll Dynamic Data futures, вы можете перевернуть свой собственный атрибут ColumnOrder следующим образом:

[AttributeUsage(AttributeTargets.Property)]
public class ColumnOrderAttribute : Attribute
{
    public int Order { get; private set; }
    public ColumnOrderAttribute() { Order = int.MaxValue; }
    public ColumnOrderAttribute(int order) { Order = order; }
    public static ColumnOrderAttribute Default = new ColumnOrderAttribute();
}

а затем в вашем классе, который реализует IAutoFieldGenerator, у вас есть

public static class ExtensionMethods
{
    public static int GetOrder (this MetaColumn column)
    {
        var orderAttribute = column.Attributes.OfType<ColumnOrderAttribute>().DefaultIfEmpty(ColumnOrderAttribute.Default).Single();
        return orderAttribute.Order;
    }
}

public ICollection GenerateFields(Control control)
{
    var fields = new List<DynamicField>();
    var columns = _table.Columns.OrderBy(column => column.GetOrder());
    foreach (var column in columns)
    {
        if (!column.Scaffold) { continue; }
        fields.Add(new DynamicField {DataField = column.Name});
    }
}

и, наконец, ваше использование будет выглядеть как

[MetadataType(typeof(CustomerMetadata))]
public partial class Customer {}

public class CustomerMetadata
{
    [ColumnOrder(1)]
    public object FirstName {get;set;}
    [ColumnOrder(2)]
    public object LastName {get;set;}
}

Ответ 7

Я отвечаю на старый вопрос, потому что мне кажется, что возможное решение изменилось в новых версиях фреймворка.

Кажется, что Display (Order) работает прямо по запросу (Visual Web Developer 2010 на .NET 4.0) без какого-либо конкретного способа обхода.

Пример:

[Display(Order = 50)]

Важно проверить правильное имя объекта для сопоставления внешнего ключа:

в одном проекте поле OperatoreID, переведенное в класс сущности, как:

public object Operatore { get; set; }

является оператором исходной таблицы внешнего ключа; для второй ссылки в той же таблице он получит что-то вроде 1 и т.д.