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