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
Espero su respuesta
Gracias de antemano
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