Кто-нибудь знает, возможно ли выбрать порядок полей в динамических данных (конечно, без настройки шаблонов для каждой таблицы)?
Спасибо!
Кто-нибудь знает, возможно ли выбрать порядок полей в динамических данных (конечно, без настройки шаблонов для каждой таблицы)?
Спасибо!
В .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; }
По этот поток - вы можете использовать ColumnOrderAttribute в dll динамических данных фьючерсов. Вы можете захватить фьючерсы из кода.
Это можно сделать, изменив порядок открытых свойств в файле LINQ to SQL.
Например, я поступил в Northwind.designer.cs, который был моим автоматически сгенерированным LINQ to SQL файлом, и переместил общедоступное свойство "Продукты" выше общедоступного свойства CategoryName в public partial class Category. Затем я перекомпилировал и шаблон по умолчанию отобразил столбцы в моем новом порядке.
Конечно, это означает, что вы редактируете автоматически сгенерированный код, и если вы его регенерируете, ваши изменения будут потеряны, поэтому этот метод не без риска.
Вам нужно создать пользовательскую страницу в папке DynamicData.
Вот шаги:
Вот скринкаст от ScottHa: http://www.asp.net/learn/3.5-SP1/video-293.aspx
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();
} }
Чтобы избежать использования 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;}
}
Я отвечаю на старый вопрос, потому что мне кажется, что возможное решение изменилось в новых версиях фреймворка.
Кажется, что Display (Order) работает прямо по запросу (Visual Web Developer 2010 на .NET 4.0) без какого-либо конкретного способа обхода.
Пример:
[Display(Order = 50)]
Важно проверить правильное имя объекта для сопоставления внешнего ключа:
в одном проекте поле OperatoreID, переведенное в класс сущности, как:
public object Operatore { get; set; }
является оператором исходной таблицы внешнего ключа; для второй ссылки в той же таблице он получит что-то вроде 1 и т.д.