Buenos días
Lllevo un tiempo intentando con esto y no hay caso, espero puedan darme una mano. Abajo copio mi código.
Tengo un formulario con Datagridview, boton para cerrar y otro boton para guardar Mi idea es que en el datagridview solo me deje insertar datos cuando el campo está vacío. Y que en caso de que ya inserté muchos datos en varias celdas vacías(aun no guardó los datos porque lo hace al salir o al hacer click en el boton guardar con la función Actualizar()) y hiciera click en una prohibida(una con datos)... que no pierda todo lo ya escrito
Mi problema es que en la validación que tengo, si hago click en una celda vacía y sin escribir nada hago click en otra celda(vacía o no)... se muere el formulario, ni siquiera el boton cerrar funciona Y tambien, así como lo tengo, me deja escribir en las celdas que ya tienen datos(números); y no quiero que lo permita, solo si la celda/campo está vacía
Cuando tienen un valor no se debería poder editar ese campo
De cualquier forma, los cambios en la base de datos se efectúan al hacer click en el botón guardar o al salir con la "x" que te pregunta si queres guardar(si es que hubo cambios)
El datagrid se carga, al cargar el formulario(podría agregar un botón refrescar), en ese momento se ven cuáles son los campos vacíos y entonces esos campos deben estar bloqueados
Espero su respuesta
Gracias de antemano
Código:
Imports MySql.Data.MySqlClient
Public Class ingreso_lecturas
'BindingSource
Private WithEvents bindingsource As New BindingSource
' Adaptador de datos sql
Private mySqlDataAdapter As MySqlDataAdapter
' Cadena de conexión
Dim myconn As New MySqlConnection("Server=localhost; user Id=user1; Password=multiredes; Database=prueba1")
' flag
Private bEdit As Boolean
' actualizar los cambios al salir
Private Sub ingreso_lecturas_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) _
Handles Me.FormClosing
If bEdit Then
'preguntar si se desea guardar
If (MsgBox("Guardar cambios ?", MsgBoxStyle.YesNo, "guardar")) = MsgBoxResult.Yes Then
Actualizar(False)
End If
End If
End Sub
Private Sub ingreso_lecturas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' propiedades del datagrid
With DataGridView1
' alternar color de filas
.AlternatingRowsDefaultCellStyle.BackColor = Color.FloralWhite
.DefaultCellStyle.BackColor = Color.Beige
' Establecer el origen de datos para el DataGridview
.DataSource = bindingsource
End With
' botones
btn_update.Text = "Guardar cambios"
' cagar los datos
cargar_registros("Select * From lectura", DataGridView1)
End Sub
Private Sub cargar_registros( _
ByVal sql As String, _
ByVal _datagridview As DataGridView)
Try
' Inicializar el SqlDataAdapter indicandole el comando y el connection string
mySqlDataAdapter = New MySqlDataAdapter(sql, myconn)
Dim mySqlCommandBuilder As New MySqlCommandBuilder(mySqlDataAdapter)
' llenar el DataTable
Dim dt As New DataTable()
mySqlDataAdapter.Fill(dt)
' Enlazar el BindingSource con el datatable anterior
bindingsource.DataSource = dt
With _datagridview
.Refresh()
' coloca el registro arriba de todo
.FirstDisplayedScrollingRowIndex = bindingsource.Position
End With
bEdit = False
Catch exSql As MySqlException
MsgBox(exSql.Message.ToString)
Catch ex As Exception
MsgBox(ex.Message.ToString)
End Try
End Sub
' botón para guardar los cambios y llenar la grilla
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btn_update.Click
Actualizar()
End Sub
Private Sub Actualizar(Optional ByVal bCargar As Boolean = True)
' Actualizar y guardar cambios (si tiene algo-if not is nothing)
If Not bindingsource.DataSource Is Nothing Then
mySqlDataAdapter.Update(CType(bindingsource.DataSource, DataTable))
'ElseIf cargar_registros("Select * From lectura where ", DataGridView1) Then
' MsgBox("No puede cambiar datos ya introducidos")
'Else
If bCargar Then
cargar_registros("Select * From lectura", DataGridView1)
End If
End If
End Sub
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
Handles DataGridView1.CellEndEdit
bEdit = True
End Sub
Private Sub dataGridView1_CellValidating(ByVal sender As Object, _
ByVal e As DataGridViewCellValidatingEventArgs) _
Handles DataGridView1.CellValidating
Dim headerText As String = _
dataGridView1.Columns(e.ColumnIndex).HeaderText
' Abort validation if cell is not in the CompanyName column.
If headerText.Equals("idUsuarios") Then Return
' Confirm that the cell is not empty.
'If Not (String.IsNullOrWhiteSpace(e.FormattedValue.ToString())) Then
'If (DataGridView1.SelectedCells.Is Not Empty(e.FormattedValue.ToString())) Then
If (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
DataGridView1.Rows(e.RowIndex).ErrorText = _
"No puede sobre-escribir lecturas anteriores"
e.Cancel = True
End If
End Sub
Private Sub Button_cerrar_Click(sender As Object, e As EventArgs) Handles Button_cerrar.Click
Me.Close()
End Sub
End Class