Este enunciado ha sido probado por nuestros especialistas así se garantiza la exactitud de nuestro post.
Solución:
DataAnnotations attributes para DataGridView en formularios Windows Forms
No hay soporte integrado para la anotación de datos en Windows Forms, pero saber cómo attributes funcionan y cómo funcionan los formularios de Windows, podemos usarlos en formularios de Windows.
Aquí, en esta publicación, mostraré un método de extensión para DataGridView
que une un IList
a DataGridView
y generar columnas automáticamente según las anotaciones de datos attributes, para que pueda obtener lo siguiente DataGridView
, llamando dataGridView1.Bind(list);
:
Mire los siguientes elementos que provienen de anotaciones de datos attributes:
- Visibilidad de la columna: La columna de identificación es invisible
- Textos de encabezado de columna: Son textos personalizados diferentes a los nombres de las propiedades.
- Orden de columnas: El orden de las columnas es personalizado, diferente de los pedidos de propiedad.
- Descripción emergente: Hemos mostrado información sobre herramientas personalizada para columnas.
- Formato de datos: Hemos utilizado un formato personalizado para la fecha.
Y muchas más cosas que aún puedes tener usando attributes.
Si bien el modelo es así:
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
[TypeDescriptionProvider(typeof(MetadataTypeTypeDescriptionProvider))]
public class Person
[Display(Name = "Id")]
[Browsable(false)]
public int? Id get; set;
[Display(Name = "First Name", Description = "First name.", Order = 1)]
public string FirstName get; set;
[Display(Name = "Last Name", Description = "Last name", Order = 2)]
public string LastName get; set;
[Display(Name = "Birth Date", Description = "Date of birth.", Order = 4)]
[DisplayFormat(DataFormatString = "yyyy-MM-dd")]
public DateTime BirthDate get; set;
[Display(Name = "Homepage", Description = "Url of homepage.", Order = 5)]
public string Url get; set;
[Display(Name = "Member", Description = "Is member?", Order = 3)]
public bool IsMember get; set;
Unir
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Windows.Forms;
public static class DataGridViewExtensions
public static void Bind(this DataGridView grid, IList data,
bool autoGenerateColumns = true)
if (autoGenerateColumns)
var properties = TypeDescriptor.GetProperties(typeof(T));
var metedata = properties.Cast().Select(p => new
Name = p.Name,
HeaderText = p.Attributes.OfType()
.FirstOrDefault()?.Name ?? p.DisplayName,
ToolTipText = p.Attributes.OfType()
.FirstOrDefault()?.GetDescription() ?? p.Description,
Order = p.Attributes.OfType()
.FirstOrDefault()?.GetOrder() ?? int.MaxValue,
Visible = p.IsBrowsable,
ReadOnly = p.IsReadOnly,
Format = p.Attributes.OfType()
.FirstOrDefault()?.DataFormatString,
Type = p.PropertyType
);
var columns = metedata.OrderBy(m => m.Order).Select(m =>
DataGridViewColumn c;
if (m.Type == typeof(bool))
c = new DataGridViewCheckBoxColumn(false);
else if (m.Type == typeof(bool?))
c = new DataGridViewCheckBoxColumn(true);
else c = new DataGridViewTextBoxColumn();
c.DataPropertyName = m.Name;
c.Name = m.Name;
c.HeaderText = m.HeaderText;
c.ToolTipText = m.ToolTipText;
c.DefaultCellStyle.Format = m.Format;
c.ReadOnly = m.ReadOnly;
c.Visible = m.Visible;
return c;
);
grid.Columns.Clear();
grid.Columns.AddRange(columns.ToArray());
grid.DataSource = data;
Validación de anotaciones de datos attributes para formularios Windows Forms
También para respaldar las validaciones de anotaciones de datos, puede implementar IDataErrorInfo
interfaz usando Validator
class, de la misma manera que lo hice en DataAnnotations Validation attributes para formularios Windows Forms.
Nota
Para mejorar la respuesta, es posible que desee crear un descriptor de tipo que se preocupe por los metadatos attributes y luego decorar los modelos con ese descriptor de tipo. Puede comenzar usando el código de AssociatedMetadataTypeTypeDescriptor
, MetadataPropertyDescriptorWrapper
, AssociatedMetadataTypeTypeDescriptionProvider
.
También puede crear una clase de metadatos y aplicar el efecto de algunos attributes me gusta Url
o DataType
en los metadatos. Mirar esta publicación le dará una idea: Combinando múltiples atributos en un solo atributo – Fusionar atributos.
Ni Infragistics UltraGrid ni Windows DataGridView admiten anotaciones de datos de esta manera. DevExpress a partir de la versión 15.1 tiene un soporte limitado de anotaciones de datos de WinForms dentro de su Control de diseño de datos https://community.devexpress.com/blogs/thinking/archive/2015/06/08/winforms-data-layout-control-data-annotation-attributes.aspx.
Encontré este enlace donde alguien está haciendo preguntas similares sobre cómo suprimir columnas dentro de Infragistics Grid mirando metadatos: http://www.infragistics.com/community/forums/t/91864.aspx
No se te olvide dar recomendación a este ensayo si te valió la pena.