Порядок полей в динамических данных? - PullRequest
11 голосов
/ 26 ноября 2008

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

Спасибо!

Ответы [ 7 ]

11 голосов
/ 20 мая 2010

В .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 голосов
/ 31 декабря 2008

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

1 голос
/ 10 апреля 2011

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

Похоже, что отображение (порядок) теперь работает напрямую, как и было задано (Visual Web Developer 2010 на .NET 4.0), без каких-либо конкретных обходных путей.

Пример:

[Display(Order = 50)]

Важно проверить правильность имени объекта, чтобы сопоставить иностранный ключ:

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

public object Operatore { get; set; }

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

1 голос
/ 10 сентября 2009

Чтобы избежать использования 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;}
}
1 голос
/ 11 августа 2009

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();
} }
1 голос
/ 23 декабря 2008

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

Вот шаги:

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

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

1 голос
/ 12 декабря 2008

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

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

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

...