2008-11-26 17 views

Respuesta

1

Puede hacerlo modificando el orden de las propiedades públicas en su archivo LINQ to SQL.

Por ejemplo, entré en Northwind.designer.cs, que era mi archivo autogenerado LINQ to SQL y moví la propiedad pública llamada Productos por encima de la propiedad pública CategoryName en la categoría de clase parcial pública. Luego volví a compilar y la plantilla predeterminada muestra las columnas en mi nuevo orden.

Por supuesto, esto significa que edita el código autogenerado y si lo regenera, sus cambios se pierden, por lo que esta técnica no está exenta de peligros.

1

Tiene que crear una página personalizada en la carpeta DynamicData.

Estos son los pasos:

  • crear una carpeta que tiene el mismo nombre que el nombre de la tabla que desea personalizar el orden de las columnas bajo "DynamicData \ CustomPages" carpeta
  • Crear una página personalizada en la carpeta "DynamicData \ CustomPages \ [carpeta con nombre de tabla]".
    • Copio el archivo "List.aspx" de "DynamicData \ PageTemplates" en la carpeta de arriba.
  • Abrir el archivo aspx y modificar el control GridView para "AutoGenerateColumns = 'false'"
  • sección de columnas Dentro de GridView, añadir controles "DynamicControl" con el valor del atributo "DataField" al nombre de la columna en el orden que quieres

Aquí es un screencast de ScottHa: http://www.asp.net/learn/3.5-SP1/video-293.aspx

2

Según this hilo - se puede utilizar el ColumnOrderAttribute en la dinámica DLL futuros de datos. Puedes agarrar el futuro de codeplex.

1

GridView tienen la propiedad ColumnsGenerator, lo utilizan al implementar el método de la interfaz GenerateFields IAutoFieldGenerator en el que se puede establecer órdenes de campos en función de sus reglas personalizadas (atributos, información de metadatos, ...)

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

Para evitar el uso los futuros de la DLL de datos dinámica, puede rodar su propio atributo ColumnOrder de la siguiente manera:

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

y luego en su clase que implementa IAutoFieldGenerator, tiene

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

y, finalmente, su uso se vería

[MetadataType(typeof(CustomerMetadata))] 
public partial class Customer {} 

public class CustomerMetadata 
{ 
    [ColumnOrder(1)] 
    public object FirstName {get;set;} 
    [ColumnOrder(2)] 
    public object LastName {get;set;} 
} 
+0

Justo lo que necesitaba ... ¡gracias! – ArjanP

11

En .NET 4.0, utilizando el 4.0 liberación de la DLL de datos dinámica, puede establecer anotaciones de datos de este modo:

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

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

estoy respondiendo a una vieja pregunta, porque me parece que la solución sea posible cambió en las últimas versiones del marco.

Parece que la pantalla (Orden) funciona ahora directamente como se le preguntó (Visual Web Developer 2010 en .NET 4.0) sin ninguna solución en particular.

Ejemplo:

[Display(Order = 50)] 

Una cosa importante es comprobar el nombre de objeto correcto para mapear la ForeignKey:

en un proyecto de un campo OperatoreID traduce en la clase de entidad como:

public object Operatore { get; set; } 

siendo Operatore la tabla fuente de la clave externa; para una segunda referencia en la misma tabla obtendrá algo así como 1 y así sucesivamente.

Cuestiones relacionadas