动态数据中字段的顺序是什么?

11

有没有人知道在动态数据中(当然,不需要自定义每个表格的模板)是否可以选择字段的顺序?

谢谢!

7个回答

12

在 .NET 4.0 中,使用 Dynamic Data dll 的 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
根据这个帖子,你可以在dynamic data futures dll中使用ColumnOrderAttribute。你可以从codeplex获得该程序集。

1
我回答一个旧问题,因为在新版本的框架中可能解决方案已经改变。
现在似乎Display(Order)直接按要求工作(在.NET 4.0上的Visual Web Developer 2010),不需要任何特殊的解决方法。
例如:
[Display(Order = 50)]

一个重要的事情是检查正确的对象名称以映射外键:

在一个项目中,一个名为OperatoreID的字段被翻译成实体类中的:

public object Operatore { get; set; }

作为外键的源表,对于同一张表的第二个引用,它将获得类似于1的东西。


1

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();
} }

1
为了避免使用动态数据特性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;}
}

1

你可以通过修改 LINQ to SQL 文件中公共属性的顺序来实现这一点。

例如,我进入了 Northwind.designer.cs 文件,这是我的自动生成的 LINQ to SQL 文件,并将名为 Products 的公共属性移动到公共部分类别的公共属性 CategoryName 之上。然后重新编译, 默认模板将按照我的新顺序显示列。

当然,这意味着你正在编辑自动生成的代码,如果重新生成它,你的更改将丢失,所以这种技术并非没有风险。


1

您需要在DynamicData文件夹中创建一个自定义页面。

以下是步骤:

  • 在“DynamicData \ CustomPages”文件夹下创建一个与您要自定义列排序的表名相同的文件夹
  • 在“DynamicData \ CustomPages \ [具有表名的文件夹]”文件夹下创建一个自定义页面。
    • 我只是将现有的“List.aspx”文件从“DynamicData \ PageTemplates”复制到上面的文件夹中。
  • 打开aspx文件并将GridView控件修改为“AutoGenerateColumns ='false'”
  • 在GridView的列部分中,使用“DataField”属性值添加“DynamicControl”控件,以按您想要的顺序命名您的列。

这是ScottHa的屏幕录像: http://www.asp.net/learn/3.5-SP1/video-293.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接