Configuración y Manipulación de DataGridView con SunnyUI

Este artículo detalla fragmentos de código comúnmente utilizados para inicializar y operar un control DataGridView, especialmente cuando se integra con la biblioteca SunnyUI.

Inicialización del DataGridView al Cargar el Formulario

La siguiente función configura las propiedades esenciales del DataGridView y añade columnas personalizadas. Incluye una columna de casilla de verificación para selecciones y columnas de texto e imagen, definiendo sus características como ancho, encabezado y visibilidad.


private void InicializarGridDatos()
{
   // Configuración general de la apariencia y comportamiento del grid
   dgvMiGrid.Font = new System.Drawing.Font("微软雅黑", 9F);
   dgvMiGrid.AutoGenerateColumns = false; // Deshabilitar la generación automática de columnas
   dgvMiGrid.AllowUserToAddRows = false;  // No permitir que los usuarios añadan filas
   dgvMiGrid.AllowUserToResizeColumns = true; // Permitir redimensionar columnas
   dgvMiGrid.AllowUserToOrderColumns = true;  // Permitir reordenar columnas

   // Añadir columna de casilla de verificación para selección
   DataGridViewCheckBoxColumn colSeleccion = new DataGridViewCheckBoxColumn();
   colSeleccion.Width = 40;
   colSeleccion.Name = "Seleccion";
   colSeleccion.HeaderText = "Seleccionar";
   dgvMiGrid.Columns.Add(colSeleccion);

   // Añadir columnas de texto y imagen usando un método de utilidad
   UtilidadesGrid.AgregarColumnaTexto(dgvMiGrid, "IdRegistro", "ID", 110);
   UtilidadesGrid.AgregarColumnaTexto(dgvMiGrid, "Nombre", "Nombre del Elemento", 150, true, false); // Ancho 150, visible, editable
   UtilidadesGrid.AgregarColumnaImagen(dgvMiGrid, "ImagenProducto", "Foto", 90); // Columna para imágenes
}
 

Clase de Utilidades para Columnas del DataGridView

Se proporciona una clase de utilidda para estandarizar la adición de columnas al DataGridView. Esta clase abstrae la creación de diferentes tipos de columnas (texto e imagen) y permite configurar sus propiedades de forma centralizada.


public static class UtilidadesGrid
{
   /// <summary>
   /// Agrega una columna de imagen a un DataGridView.
   /// </summary>
   /// <param name="dgv">El control DataGridView.</param>
   /// <param name="nombreColumna">El nombre de la columna.</param>
   /// <param name="encabezado">El texto del encabezado de la columna.</param>
   /// <param name="ancho">El ancho de la columna.</param>
   /// <param name="visible">Indica si la columna es visible.</param>
   /// <param name="esFijo">Indica si la columna debe permanecer fija al hacer scroll horizontal.</param>
   public static void AgregarColumnaImagen(DataGridView dgv, string nombreColumna, string encabezado, int ancho = 50, bool visible = true, bool esFijo = false)
   {
       DataGridViewImageColumn colImagen = new DataGridViewImageColumn();
       colImagen.ImageLayout = DataGridViewImageCellLayout.Zoom; // Ajustar imagen al tamaño de la celda
       colImagen.Name = nombreColumna;
       colImagen.DataPropertyName = nombreColumna; // Vincula la columna a la propiedad del origen de datos
       colImagen.HeaderText = encabezado;
       colImagen.Width = ancho;
       colImagen.Visible = visible;
       colImagen.Frozen = esFijo; // Configura si la columna está fijada
       dgv.Columns.Add(colImagen);
   }

   /// <summary>
   /// Agrega una columna de texto a un DataGridView con configuración de relleno automático.
   /// </summary>
   /// <param name="dgv">El control DataGridView.</param>
   /// <param name="nombreColumna">El nombre de la columna.</param>
   /// <param name="encabezado">El texto del encabezado de la columna.</param>
   /// <param name="ancho">El ancho de la columna. Si es 0, se usará relleno automático.</param>
   /// <param name="visible">Indica si la columna es visible.</param>
   /// <param name="editable">Indica si la columna es editable.</param>
   /// <param name="esFijo">Indica si la columna debe permanecer fija.</param>
   public static void AgregarColumnaTextoRelleno(DataGridView dgv, string nombreColumna, string encabezado, int ancho = 0, bool visible = true, bool editable = true, bool esFijo = false)
   {
       ancho = Math.Max(ancho, 2); // Asegurar un ancho mínimo
       DataGridViewTextBoxColumn colTexto = new DataGridViewTextBoxColumn();
       colTexto.Frozen = esFijo;
       colTexto.AutoSizeMode = (ancho == 0) ? DataGridViewAutoSizeColumnMode.Fill : DataGridViewAutoSizeColumnMode.NotSet; // Relleno automático si ancho es 0
       colTexto.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter; // Alineación del encabezado
       colTexto.ReadOnly = !editable; // Establecer si es editable
       colTexto.Name = nombreColumna;
       colTexto.DataPropertyName = nombreColumna;
       colTexto.HeaderText = encabezado;
       colTexto.Width = (ancho > 0) ? ancho : 100; // Ancho predeterminado si no se rellena
       colTexto.Visible = visible;
       colTexto.MinimumWidth = ancho > 0 ? ancho : 50; // Ancho mínimo
       dgv.Columns.Add(colTexto);
   }

   /// <summary>
   /// Agrega una columna de texto estándar a un DataGridView.
   /// </summary>
   /// <param name="dgv">El control DataGridView.</param>
   /// <param name="nombreColumna">El nombre de la columna.</param>
   /// <param name="encabezado">El texto del encabezado de la columna.</param>
   /// <param name="ancho">El ancho de la columna.</param>
   /// <param name="visible">Indica si la columna es visible.</param>
   /// <param name="editable">Indica si la columna es editable.</param>
   /// <param name="esFijo">Indica si la columna debe permanecer fija.</param>
   public static void AgregarColumnaTexto(DataGridView dgv, string nombreColumna, string encabezado, int ancho = 50, bool visible = true, bool editable = true, bool esFijo = false)
   {
       ancho = Math.Max(ancho, 2);
       DataGridViewTextBoxColumn colTexto = new DataGridViewTextBoxColumn();
       colTexto.Frozen = esFijo;
       colTexto.AutoSizeMode = DataGridViewAutoSizeColumnMode.None; // No usar relleno automático por defecto
       colTexto.ReadOnly = !editable;
       colTexto.Name = nombreColumna;
       colTexto.DataPropertyName = nombreColumna;
       colTexto.HeaderText = encabezado;
       colTexto.Width = ancho;
       colTexto.Visible = visible;
       colTexto.MinimumWidth = ancho;

       // Añadir un asterisco al encabezado si la columna no es editable
       if (!editable)
       {
           colTexto.HeaderText = encabezado + " *";
       }
       dgv.Columns.Add(colTexto);
   }
}
 

Carga y Vinculación de Datos

Este segmento muestra cómo cargar datos desde una base de datos y asignarlos al DataGridView. Se utiliza un helper de acceso a datos (SqlHelper) para ejecutar una consulta SQL y obtener un DataSet. Luego, se prepara una tabla de datos para incluir una columna de tipo Image, se establece el valor predeterminado para celdas de imagen nulas y finalemnte se asigna la tabla de datos como origen para el DataGridView. Se itera sobre las filas para cargar las imágenes correspondientes desde una ruta especificada, utilizando un método GetFtpImage de la clase CommonUtil (asumido existente).


private void CargarRegistros()
{
   string consultaSQL = "SELECT Id, Nombre, UrlImagen FROM Usuarios"; // Consulta SQL de ejemplo
   DataSet datosObtenidos = new DataSet();
   // Asume que SqlHelper.ExecuteDataSet es un método estático para ejecutar consultas
   // y llenar un DataSet. Podría ser necesario ajustar según la implementación real.
   SqlHelper.ExecuteDataSet(ref datosObtenidos, consultaSQL);

   if (datosObtenidos.Tables.Count > 0)
   {
       DataTable tablaDatos = datosObtenidos.Tables[0]; // Usar la primera tabla del DataSet

       // Añadir columna para la imagen si no existe o prepararla
       if (!tablaDatos.Columns.Contains("ImagenVista"))
       {
           tablaDatos.Columns.Add("ImagenVista", typeof(Image));
       }

       // Configurar la columna de imagen en el DataGridView si ya existe
       if (dgvMiGrid.Columns.Contains("ImagenProducto"))
       {
           // Asegurarse de que la celda muestre null si no hay valor
           dgvMiGrid.Columns["ImagenProducto"].DefaultCellStyle.NullValue = null;
       }

       dgvMiGrid.DataSource = tablaDatos; // Asignar la tabla de datos como origen

       // Cargar las imágenes en la columna correspondiente
       for (int i = 0; i < dgvMiGrid.RowCount; i++)
       {
           // Asume que 'UrlImagen' es la columna en la tabla de datos que contiene la ruta de la imagen
           object valorCeldaUrl = dgvMiGrid.Rows[i].Cells["UrlImagen"].Value;
           if (valorCeldaUrl != null && !string.IsNullOrWhiteSpace(valorCeldaUrl.ToString()))
           {
               string rutaImagen = valorCeldaUrl.ToString();
               // Asume que CommonUtil.GetFtpImage maneja la carga de imágenes (ej. desde FTP o disco)
               dgvMiGrid.Rows[i].Cells["ImagenProducto"].Value = CommonUtil.GetFtpImage(rutaImagen);
           }
           else
           {
                dgvMiGrid.Rows[i].Cells["ImagenProducto"].Value = null; // Asegurar que sea nulo si no hay URL
           }
       }
   }
}
 

La paginación de datos debe implementarse utilizanod mecanismos alternativos o específicos para la gestión de grandes volúmenes de información.

Etiquetas: WinForms SunnyUI DataGridView C# UI Controls

Publicado el 5-31 07:36