¿Alguien sabe si es posible para elegir el orden de los campos en Datos dinámicos (por supuesto, sin personalizar las plantillas de cada tabla)?¿Orden de campos en datos dinámicos?
Gracias!
¿Alguien sabe si es posible para elegir el orden de los campos en Datos dinámicos (por supuesto, sin personalizar las plantillas de cada tabla)?¿Orden de campos en datos dinámicos?
Gracias!
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.
Tiene que crear una página personalizada en la carpeta DynamicData.
Estos son los pasos:
Aquí es un screencast de ScottHa: http://www.asp.net/learn/3.5-SP1/video-293.aspx
Según this hilo - se puede utilizar el ColumnOrderAttribute en la dinámica DLL futuros de datos. Puedes agarrar el futuro de codeplex.
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();
} }
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;}
}
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; }
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.
Justo lo que necesitaba ... ¡gracias! – ArjanP