none
Diseño de DataGridView RRS feed

  • Pregunta

  • Cordial saludo, espero me puedan ayudar.

    Tengo un DataGridView en WinForms el cual lo diseño con un DataTable de la siguiente manera.

    private DataTable dtDetalle;
            void ListDetalles()
            {
                dtDetalle = new DataTable("Detalle");
                dtDetalle.Columns.Add("Id", Type.GetType("System.Int32"));
                dtDetalle.Columns.Add("Cuota", Type.GetType("System.Int32"));
                dtDetalle.Columns.Add("Meses", Type.GetType("System.Int32"));
                dtDetalle.Columns.Add("Dias", Type.GetType("System.Int32"));
                dtDetalle.Columns.Add("Auxiliar", Type.GetType("System.String"));
                dtDetalle.Columns.Add("DescripAuxiliar", Type.GetType("System.String"));
                dgvListDetalle.DataSource = dtDetalle;
                ArreglarList();
            }
    
            void ArreglarList()
            {
                dgvListDetalle.Columns["Id"].Visible = false;
                dgvListDetalle.Columns["Cuota"].HeaderText = "# CUOTAS";
                dgvListDetalle.Columns["Cuota"].Width = 70;
                dgvListDetalle.Columns["Cuota"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListDetalle.Columns["Meses"].HeaderText = "# MESES";
                dgvListDetalle.Columns["Meses"].Width = 100;
                dgvListDetalle.Columns["Meses"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListDetalle.Columns["Dias"].HeaderText = "# DÍAS";
                dgvListDetalle.Columns["Dias"].Width = 100;
                dgvListDetalle.Columns["Dias"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListDetalle.Columns["Auxiliar"].HeaderText = "AUXILIAR";
                dgvListDetalle.Columns["Auxiliar"].Width = 100;
                dgvListDetalle.Columns["Auxiliar"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
                dgvListDetalle.Columns["Auxiliar"].DefaultCellStyle.BackColor = Color.Honeydew;
                dgvListDetalle.Columns["DescripAuxiliar"].HeaderText = "DESCRIPCIÓN";
                dgvListDetalle.Columns["DescripAuxiliar"].Width = 300;
                dgvListDetalle.Columns["DescripAuxiliar"].ReadOnly = true;
            }

    Hasta este momento todo bien.

    1. Lo que quiero en si es que al momento de ir agregando la información de manera manual y llegando a la celda Auxiliar del DataGridView me habilite un botón con una imagen puede ser una lupa al lado derecho de la celda para dar clic en él y enviándome a otro formulario donde pueda seleccionar dicho registro y me lo devuelva ese dato a la misma celda.

    2. En otro DataGridView del mismo proyecto que lo diseño de la misma manera pero este cuenta con una columna donde ingreso la fecha y me gustaría que me apareciera en esa celda la opción de seleccionar la fecha como el control DateTimePicker.

    3. En ambos DataGridView quiero que al momento de terminar de rellenar de manera manual una fila y bajar a una nueva me valide ciertas celdas de la fila anterior terminada.

    4. En ambos DataGridView veo que cuando estoy escribiendo una fila automáticamente se aumenta otra mas debajo, me gustaría que no me aumente esa fila nueva automáticamente si no de manera manual una vez termina de agregar los datos de la fila con el teclado baje y me aumente una fila nueva y si vuelvo a subir sin cargar información en esa fila nueva automáticamente se desaparezca y no quede como una fila en blanco.

    Eso es todo espero me entiendan y me puedan ayudar, de antemano una gracias.

    miércoles, 29 de noviembre de 2017 16:02

Respuestas

  • Hola Oscar,

    las preguntas deberían ser más concretas. Por un lado son muchos temas diferentes cada uno de ellos con múltiples soluciones posibles, por lo que estarían mejor cada uno con su propio hilo.

    Por otro lado el propósito de este sitio es el de ayudar a solucionar problemas, no el de realizar tareas. Deberías tratar de realizar cada punto y preguntar cuando te encuentres con errores que no eres capaz de corregir o partes que no sepas como abordar.

    Dicho esto, a ver si te doy unos apuntes para que tengas algo con lo que empezar.

    Empezaré por el punto 2 que me parece un caso más general que el 1. Para que la celda del DataGridView tenga un editor similar (o igual) al del DateTimePicker lo que tendrás que hacer es crear un tipo de columna (DataGridViewColumn) personalizado. Con el DataGridView ya vienen algunos tipos de columnas (como la de texto, checkbox, ...) pero si quieres una con una funcionalidad diferente deberás creártela tú mismo.

    No es muy difícil crear una columna que utilice un control ya existente (como el DateTimePicker) como editor. En internet puedes encontrar multitud de ejemplos. En concreto en mi blog puedes encontrar uno con el DateTimePicker:

    DataGridView. Columna con editor de fechas

    Para el punto 1 entiendo que la mejor solución sería la de crearte un control que agrupe la funcionalidad del TextBox con la búsqueda de registros y crear un nuevo tipo de columna que utilice este control como editor. También tienes en mi blog un ejemplo de cómo crear un control como este:

    Control TextBox con Botón

    En cuanto a las validaciones tienes diferentes eventos en el DataGridView que te permiten ejecutar código en cualquier momento de la edición (al finalizar la edición de una celda, al añadir una nueva fila, al cambiar la fila actual,...), sería cuestión de elegir el evento adecuado e introducir ahí el código de validación.

    Para el cuarto punto lo más sencillo es deshabilitar la posibilidad de añadir nuevas filas e incluir algún tipo de botón que, al pulsarlo, añada la nueva fila por código.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    lunes, 4 de diciembre de 2017 11:58