11

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

谢谢 !

4

7 回答 7

12

在 .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; }
于 2010-05-19T22:02:13.597 回答
2

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

于 2008-12-30T23:02:17.123 回答
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

于 2008-12-23T17:46:08.343 回答
1

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

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

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

于 2008-12-12T00:15:28.627 回答
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();
} }
于 2009-08-11T15:07:19.663 回答
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;}
}
于 2009-09-10T06:03:26.353 回答
1

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

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

例子:

[Display(Order = 50)]

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

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

public object Operatore { get; set; }

操作外键的源表;对于同一张表上的第二个引用,它将得到类似 1 的内容,依此类推。

于 2011-04-10T09:22:59.283 回答