Mostrando entradas con la etiqueta Filas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Filas. Mostrar todas las entradas

Ajustar la celda de un DataGridView a su contenido

Problema: Necesito que la celda de un grid se vuelva más ancha de lo que aparece normalmente y que se ajuste a su contenido, sobre todo, cuando en una celda puede contener varías líneas de texto.
Solución: Hacerlo directamente desde el diseñador del DataGridView es un dolor de cabeza, pues se me confunden las propiedades que pongo para las filas, columnas y demás yerbas, por lo que, generalmente, no logro el efecto adecuado. Por lo que encontré una manera de hacerlo vía código, que es sencillo y se puede usar en cualquier parte.

Supongamos que tengo un grid llamado DataGridView1, por lo que hago lo siguiente.

'Determinamos el alto de las filas
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells

'Referenciamos la columna
Dim col As DataGridViewColumn = DataGridView1.Columns("nombre_columna")

'Ajustamos la celda a su contenido.
col.DefaultCellStyle.WrapMode = DataGridViewTriState.True

Mover fila en el DataGridView arriba y abajo con botón DataGridViewButtonColumn

Problema: Tengo un grid con dos columnas tipo botón, un botón indica subir una fila y el otro botón indica bajar una fila. Debo mover las filas de arriba hacia abajo dependiendo del clic en su respectivo botón.
Solución: Después de buscar por un buen rato en el Internet, no encontré una forma directa, así que tuve que realizar mi propia opción.

Nota: Mi DataGridView está enlazado a un BindingSource el cual está enlazado a un DataTable (que enredo), lo que significa que los datos iniciales (los que se presentan en el grid) son fueron llenados originariamente en el DataTable, por lo que debo modificar directamente el DataTable.

La acción de mover no es otra cosa que eliminar la fila actual e insertarla una posición arriba o abajo de la que se encontraba originariamente.

'Debo obtener la acción clic de la columna botón
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
       'Sirve para obtener el índice de la fila a mover
        Dim indice As Integer
       'Se crea una nueva fila a partir de la DataTable que está enlazada al grid
        Dim dr As DataRow = DataTable.NewRow()
        'Obtiene la posición actual de la fila a moverse
        indice = DataGridView1.CurrentRow.Index
        'Pregunto si se dio clic en la columna botón arriba
        If DataGridView1.Columns(e.ColumnIndex).Name = "arriba" Then
                'Se encuentra en la parte superior del grid
                If indice = 0 Then
                        Exit Sub
                End If
                'Se deben de insertar los datos en la fila, campo x campo
                dr(0) = DataGridView1.Rows(indice).Cells("campo0").Value
                dr(1) = DataGridView1.Rows(indice).Cells("campo1").Value
                'Primero se elimina la fila actual
                DataTable.Rows.RemoveAt(indice)
                'Después se inserta la fila copiada una posición arriba
                DataTable.Rows.InsertAt(dr, indice - 1)
                'Posiciona el foco en la posición actual
                DataTable.CurrentCell = DataTable.Rows(indice - 1).Cells(0)
        End If
        'Se repiten los mismos pasos para la columna botón abajo
        'Solo que se cambia el signo
        'Click en la columna botón abajo
        If DataGridView1.Columns(e.ColumnIndex).Name = "abajo" Then
                'Se encuentra en la parte inferior del grid
                If indice = DataGridView1.Rows.Count - 1 Then
                        Exit Sub
                End If
                'Se deben de insertar los datos en la fila, campo x campo
                dr(0) = DataGridView1.Rows(indice).Cells("campo0").Value
                dr(1) = DataGridView1.Rows(indice).Cells("campo1").Value
                'Primero se elimina la fila actual
                DataTable.Rows.RemoveAt(indice)
                'Después se inserta la fila copiada una posición abajo
                DataTable.Rows.InsertAt(dr, indice + 1)
                'Posiciona el foco en la posición actual
                DataTable.CurrentCell = DataTable.Rows(indice + 1).Cells(0)
        End If
End Sub

No se necesita actualizar el BindingSource o el DataGridView, si están enlazados al DataTable, puesto que se hace automáticamente.

Pasar filas de un DataGridView a otro con DataGridViewCheckBoxCell

Gracias a esta página pude encontrar una solución a mi problema
C# - [DataGridView] - Pasar Registros entre Grillas

Problema: Tengo dos formularios, cada uno con un grid. Necesito pasar los datos del grid del form1 al form2, pero solo los registros que estén seleccionados por la columna DataGridViewCheckBoxCell.
Solución: La que indica la página de referencia, pero en VB.Net.

Como indica en el link, existen dos formas de añadir los datos, dependiendo de si están los datos enlazados o no al grid de origen. En mi caso, los datos no están enlazados, y lo hice de la siguiente manera.

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles button1.Click
       'Se define una lista temporal de registro seleccionados
        Dim FilasSeleccionadas As New List(Of DataGridViewRow)()
          'Se recorre cada registro del grid de origen
        For Each row As DataGridViewRow In DataGridView1.Rows
                    'Se recupera el campo que representa el checkbox,
                    'se valida que esté seleccionado y agregándolo a la lista temporal
                    Dim cellSelecion As DataGridViewCheckBoxCell = _
                    TryCast(row.Cells("Seleccion"), DataGridViewCheckBoxCell)

                    If Convert.ToBoolean(cellSelecion.Value) Then
                        FilasSeleccionadas.Add(row)
                    End If
        Next
        'Se agrega el ítem seleccionado al grid de destino
         'eliminando la fila del grid original
        For Each row As DataGridViewRow In FilasSeleccionadas
                    DataGridView2.Rows.Add(row.Cells("campo1").Value, row.Cells("campo2"))
                    DataGridView1.Rows.Remove(row)
        Next
End Sub

Buscar o validar si existe un dato en el DataGridView

Cuando un usuario está ingresando nuevos datos en un grid, muchas veces necesito validar que lo ingresado no se encuentre repetido entre los otros datos, por ejemplo el código, cédula, serie, marca, modelo, etc. Por lo que he creado una función que busca, entre todos los registros del grid, si dicho dato se repite.

Nota: Recordar que los datos nuevos que se ingresan, se hacen en la ultima fila

Private Function ExisteDatoEnGrid() As Boolean
        Dim UltimaFila As Integer
        Dim cVal as String
       
        'Obtengo la ultima fila para que no se procese hasta el final
        UltimaFila = DataGridView1.Rows.Count - 1
        'Obtengo el valor de la primera columna ingresado por el usuario
        cVal = DataGridView1.Rows(UltimaFila).Cells(0)
       
        'Para cada fila del grid
        For Each row As DataGridViewRow In DataGridView1.Rows
            'Si es la última fila, se termina la función
            If row.Index = UltimaFila Then
                Exit Function
            End If
           
            'Pregunto si el dato de la primera columna es igual a lo ingresado en
            'la ultima fila
            If System.Convert.ToString(row.Cells(0).Value) = cVal Then
                MsgBox("Este dato ya existe", MsgBoxStyle.Critical)
                ExisteDatoEnGrid = True
                Exit Function
            Else
                ExisteDatoEnGrid = False
            End If
        Next
End Function

El uso de esta función es, por ejemplo, cuando se da clic en el botón grabar.

Private Sub button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles button1.Click
        if ExisteDatoEnGrid = True Then
                Exit Sub
        Else
                'Aquí puedo continuar
        End If
End Sub

Seleccionar la ultima fila de un DataGridView

Se puede saber en dónde está la última fila del DataGridView con la propiedad count.

Dim UltimaFila as Integer
UltimaFila = DataGridView1.Rows.Count - 1 'Aquí saco el número de filas del DataGridView, y le resto uno porque los índices comienza a contar en cero

Luego selecciono la fila así.

DataGridView1.Rows(UltimaFila).Selected = true 'Selecciono la fila con el último índice