El caso:
Tenemos la tarea de llenar los datos requeridos para guardarlos y mostrarlos en una lista. Pero aveces es necesario y práctico realizar cambios, mas específicamente al tratar de guardar en la BD, con solo poquísima necesidad de hacer clic en cuantos botones y controles pudiéramos disponer para que el usuario final pueda interactuar, ya sea por cuestiones de facilitarlo o porque no hay mucho espacio en la ventana que estemos programando en ese momento. Entonces porque no hacer todo este rollo con solo cambiar de fila o columna, es decir con solo tocar la bendita celda?...pues acá les va un ejemplo práctico.
A la práctica:
En mi DataGridView Cuento con 4 COLUMNAS, que corresponden a 3 CAMPOS de la tabla con la que deseo interactuar, y que cada vez que cambie y valide los datos de las celdas se insertaran o actualizaran dependiendo del caso, y en el caso de eliminar tengo una ultima columna que me permitirá hacer clic para eliminar el registro completo. (Ojo el campo que corresponde a la clave primaria esta oculto en el grid)
Para todo esto deberán ubicar el EVENTO donde se desencadene el cambio de un valor dentro de una celda. En DataGridView se llama CellValueChanged
También tienen que considerar el hecho de como esta estructurado la tabla donde se guardaran los datos, es decir si de hecho poseen un clave primaria y si los demás campos permiten valor nulo, por lo que se validará de la siguiente forma.
Private Sub DataGridView_CellValueChanged(ByVal sender AsSystem.Object, ByVal e AsSystem.Windows.Forms.DataGridViewCellEventArgs) HandlesDataGridView.CellValueChanged
' aca indico si la columna
de la fila donde estoy escribiendo es diferente a la ultima columna (eliminar)
If
e.ColumnIndex <> 3 Then
'aca pondras tu codigo que
usaras para interactuar con la BASE DE DATOS
'ademas de la coneccion, tabien
se deben definir las variables
'que serviran como parametros
al momento de insertar o actualizar
'en un principio capturamos
los datos parametro,
'sobre todo el de la celda
que contiene la clave primaria,
'es decir _cod_util que es
un campo numerico
._cod_util =
dg_utilidades.Item(0, e.RowIndex).Value
._nombre = dg_utilidades.Item(1, e.RowIndex).Value
'si estoy dentro de una columna que implica escribir
un numero pues lo valido de la siguiente forma
If Not DataGridView.Item(2,
e.RowIndex).Value Is Nothing
Then
If IsNumeric(DataGridView.Item(2,
e.RowIndex).Value) = False Then
' si no cumple el requisito de un
numero, a lo que escribi recientemente
'y se remplaza por
su valor por defecto ("")
'y terminamos este
evento para que vuelvan a escribir correctamente
DataGridView.Item(2, e.RowIndex).Value = ""
Exit Sub
End If
End If
._tasa = DataGridView.Item(2, e.RowIndex).Value
' esta
validadacion es importante
'ya que decidira si se
insertara o solo se modificara el registro en la BD
' dependiendo de lo que
capturo como dato nuestro parametro _cod_util arriba entonces
If
._cod_util = 0 Then
'es logigo asumir que
si se capturo el valor cero o un valor en blanco o nulo,
'esta operacion es para
insertar un nuevo registro
'y no se olviden de
validar si los demas datos son requisito ingresar,
'de lo contrario no
considerar estos IF
If Not ._nombre Is Nothing Then
If ._tasa <> 0 Then
'aca usas tu codigo para
instertar en la base de datos
'una ves
grabada la data debemos hacer que la clave primaria retorne
'para que
la celda contenga el nuevo dato del codigo unico
DataGridView.Item(0,
e.RowIndex).Value = ._cod_util
End If
End If
End If
Else
'si se capturo un valor
cualquiera menos los valores cero, vacios o nulos,
'es logico asumir que
esta operacion ya tiene un registro en la BD
'y solo es para
actualizar los datos escritos en las celdas
'y no se olviden de
validar si los demas datos son requisito ingresar,
'de lo contrario no
considerar estos IF
'si no cumple la
validacion devolvemos a la celda el valor anterior para esta celda
'que obviamente esta en
el registro de la BD
'por lo deberiamos
hacer una consulta para justamente traer el valor
If Not ._nombre Is Nothing Then
If ._nombre.Trim.Length <> 0 Then
If ._tasa <> 0 Then
'aca usas
tu codigo para actualizar en la base de datos
Else
DataGridView.Item(2,
e.RowIndex).Value = _sql_config.query_registro("tbl_utilidad",
"cod_util=" & DataGridView.Item(0,
e.RowIndex).Value).Rows(0).Item("tasa")
End If
Else
DataGridView.Item(1,
e.RowIndex).Value = _sql_config.query_registro("tbl_utilidad",
"cod_util=" & DataGridView.Item(0,
e.RowIndex).Value).Rows(0).Item("nombre")
End If
Else
DataGridView.Item(1, e.RowIndex).Value = _sql_config.query_registro("tbl_utilidad", "cod_util="
& DataGridView.Item(0, e.RowIndex).Value).Rows(0).Item("nombre")
End If
End If
DataGridView.Item(3,
e.RowIndex).Value = "ELIMINAR"
End If
End Sub
ESTE CODIGO ES SOLO PARA ELIMINAR UN REGISTRO DE LA BASE DE DATOS USANDO COMO DESENCADENADOR UN CELDA EN FORMA DE LINK
Private Sub DataGridView_CellContentClick(ByVal sender AsSystem.Object, ByVal e AsSystem.Windows.Forms.DataGridViewCellEventArgs) HandlesDataGridView.CellContentClick
If e.ColumnIndex = 3 Then
'aca
validamos si la celda de la columna donde esta la clave primaria tiene valor o
no y de acuerdo a esto eliminar en la BD
If DataGridView.Item(0, e.RowIndex).Value = 0 Then
DataGridView.Rows.RemoveAt(e.RowIndex)
Else
'aca usas tu codigo para actualizar en la base de datos
._cod_util = DataGridView.Item(0, e.RowIndex).Value
If .transact_utilidades
= True Then
DataGridView.Rows.RemoveAt(e.RowIndex)
End If
End With
End If
End If
End Sub
Post relacionados :