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.