【问题标题】:Order of fields in Dynamic Data?动态数据中的字段顺序?
【发布时间】:2010-09-24 05:27:57
【问题描述】:

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

谢谢!

【问题讨论】:

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


    【解决方案1】:

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

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

    例子:

    [Display(Order = 50)]
    

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

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

    public object Operatore { get; set; }
    

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

    【讨论】:

      【解决方案2】:

      在 .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; }
      

      【讨论】:

        【解决方案3】:

        为避免使用动态数据期货 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;}
        }
        

        【讨论】:

          【解决方案4】:

          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】:

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

            【讨论】:

              【解决方案6】:

              您必须在 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

              【讨论】:

                【解决方案7】:

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

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

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

                【讨论】:

                  猜你喜欢
                  • 2022-11-30
                  • 2021-11-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-05-31
                  • 2013-01-08
                  • 2013-11-22
                  • 2017-08-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多