有谁知道是否可以在动态数据中选择字段的顺序(当然,无需自定义每个表的模板)?
谢谢 !
在 .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 中使用 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 的上方。然后我重新编译,默认模板以我的新顺序显示列。
当然,这意味着您编辑自动生成的代码,如果您重新生成它,您的更改就会丢失,因此这种技术并非没有危险。
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();
} }
为避免使用动态数据期货 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;}
}
我正在回答一个老问题,因为在我看来,可能的解决方案在新版本的框架中发生了变化。
似乎 Display(Order) 现在直接按要求工作(.NET 4.0 上的 Visual Web Developer 2010),没有任何特定的解决方法。
例子:
[Display(Order = 50)]
重要的是检查正确的对象名称以映射外键:
在一个项目中,将实体类中的字段 OperatoreID 翻译为:
public object Operatore { get; set; }
操作外键的源表;对于同一张表上的第二个引用,它将得到类似 1 的内容,依此类推。