动态数据中的字段顺序?

时间:2008-11-26 19:36:30

标签: asp.net asp.net-dynamic-data

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

谢谢!

7 个答案:

答案 0 :(得分:11)

在.NET 4.0中,使用4.0版本的Dynamic Data dll,您可以设置数据注释,如下所示:

[Display(Name = " Mission Statement", Order = 30)]
public object MissionStatement { get; set; }

[Display(Name = "Last Mod", Order = 40)]  
public object DateModified { get; private set; }

答案 1 :(得分:2)

根据this线程 - 您可以在动态数据期货dll中使用ColumnOrderAttribute。你可以从codeplex中获取期货。

答案 2 :(得分:1)

您可以通过修改LINQ to SQL文件中公共属性的顺序来执行此操作。

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

当然,这意味着您编辑自动生成的代码,如果重新生成代码,您的更改将会丢失,因此这种技术并非没有危险。

答案 3 :(得分:1)

您必须在DynamicData文件夹中创建自定义页面。

以下是步骤:

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

以下是ScottHa的截屏视频: http://www.asp.net/learn/3.5-SP1/video-293.aspx

答案 4 :(得分: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();
} }

答案 5 :(得分: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;}
}

答案 6 :(得分:1)

我正在回答一个老问题,因为在我看来,可能的解决方案在较新版本的框架中发生了变化。

似乎显示(订单)现在直接按要求(Visual Web Developer 2010 on .NET 4.0)工作,没有任何特定的解决方法。

示例:

[Display(Order = 50)]

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

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

public object Operatore { get; set; }

是Operatore外键的源表;对于同一个表上的第二个引用,它将得到类似于1的东西。