【发布时间】:2010-09-24 05:27:57
【问题描述】:
有人知道是否可以在动态数据中选择字段的顺序(当然,无需自定义每个表格的模板)?
谢谢!
【问题讨论】:
标签: asp.net asp.net-dynamic-data
有人知道是否可以在动态数据中选择字段的顺序(当然,无需自定义每个表格的模板)?
谢谢!
【问题讨论】:
标签: asp.net asp.net-dynamic-data
我正在回答一个老问题,因为在我看来,可能的解决方案在新版本的框架中发生了变化。
似乎 Display(Order) 现在可以按要求直接工作(.NET 4.0 上的 Visual Web Developer 2010),没有任何特殊的解决方法。
例子:
[Display(Order = 50)]
检查正确的对象名称以映射外键是很重要的:
在一个项目中,将实体类中的字段 OperatoreID 翻译为:
public object Operatore { get; set; }
操作外键的源表;对于同一张表上的第二个引用,它将得到类似 1 的内容。
【讨论】:
在 .NET 4.0 中,使用 4.0 版本的动态数据 dll,您可以像这样设置数据注释:
[Display(Name = " Mission Statement", Order = 30)]
public object MissionStatement { get; set; }
[Display(Name = "Last Mod", Order = 40)]
public object DateModified { get; private set; }
【讨论】:
为避免使用动态数据期货 dll,您可以滚动您自己的 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;}
}
【讨论】:
GridView 具有 ColumnsGenerator 属性,通过实现 IAutoFieldGenerator 接口的 GenerateFields 方法来使用它,您可以在其中根据自定义规则(属性、元信息...)设置字段顺序
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();
} }
【讨论】:
根据this 线程 - 您可以在动态数据期货 dll 中使用 ColumnOrderAttribute。您可以从 codeplex 获取期货。
【讨论】:
您必须在 DynamicData 文件夹中创建一个自定义页面。
步骤如下:
这是 ScottHa 的截屏视频: http://www.asp.net/learn/3.5-SP1/video-293.aspx
【讨论】:
您可以通过修改 LINQ to SQL 文件中公共属性的顺序来完成此操作。
例如,我进入了 Northwind.designer.cs,这是我自动生成的 LINQ to SQL 文件,并将名为 Products 的公共属性移动到公共部分类 Category 中公共属性 CategoryName 的上方。然后我重新编译,默认模板以我的新顺序显示列。
当然,这意味着您正在编辑自动生成的代码,如果您重新生成它,您的更改就会丢失,因此这种技术并非没有危险。
【讨论】: