asp.net - ejemplos - django
¿Orden de campos en datos dinámicos? (7)
¿Alguien sabe si es posible elegir el orden de los campos en Datos dinámicos (por supuesto, sin personalizar las plantillas de cada tabla)?
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 LINQ to SQL generado automáticamente y moví la propiedad pública llamada Products por encima de la propiedad pública CategoryName en la categoría pública de clase parcial. Luego volví a compilar y la plantilla predeterminada muestra las columnas en mi nuevo orden.
Por supuesto, esto significa que editas el código generado automáticamente y si lo regeneras, tus cambios se pierden, por lo que esta técnica no está exenta de peligros.
Tienes que crear una página personalizada en la carpeta DynamicData.
Estos son los pasos:
- Cree una carpeta que sea del mismo nombre que el nombre de su tabla y desee personalizar el orden de las columnas en la carpeta "DynamicData / CustomPages"
- Cree una página personalizada en la carpeta "DynamicData / CustomPages / [carpeta con nombre de tabla]".
- Solo copio el archivo existente "List.aspx" de "DynamicData / PageTemplates" en la carpeta de arriba.
- Abra el archivo aspx y modifique el control GridView a "AutoGenerateColumns = ''false''"
- Dentro de la sección de columnas de GridView, agregue los controles "DynamicControl" con el valor del atributo "DataField" al nombre de su columna en el orden que desee.
Aquí hay un screencast de ScottHa: http://www.asp.net/learn/3.5-SP1/video-293.aspx
Según este hilo, puede usar ColumnOrderAttribute en la dll de datos dinámicos de futuros. Puedes agarrar el futuro de codeplex.
GridView tiene la propiedad ColumnsGenerator, úsala implementando el método GenerateFields de la interfaz IAutoFieldGenerator en el que puedes establecer órdenes de campos según tus reglas personalizadas (atributos, metainformación, ...)
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 del dll de futuros de datos dinámicos, puede desplegar 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 tu clase que implementa IAutoFieldGenerator, tienes
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 tu uso se vería como
[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 la versión 4.0 del dll Dynamic Data, puede establecer las anotaciones de datos de esta manera:
[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 una pregunta anterior porque me parece que la posible solución ha cambiado en las versiones más recientes 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 verificar el nombre del objeto correcto para mapear la clave externa:
en un proyecto, un campo OperatoreID traducido 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.