Saltar al contenido

Compatibilidad con anotaciones de datos en formularios Windows Forms

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.

ingrese la descripción de la imagen aquí

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 Método de extensión

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *