Autor Tema: Ayuda con validacion de celda en DataGridView Visual Basic CellBeginEdit  (Leído 14310 veces)

lucas1234

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
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

Código: [Seleccionar]
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
« Última modificación: 15 de Septiembre 2014, 13:53 por Alex Rodríguez »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Ayuda con validacion de celda
« Respuesta #1 en: 20 de Marzo 2014, 08:55 »
Confírmame si se trata de esto porque no lo veo del todo claro:

Tienes un datagrid que cuando se abre el formulario se rellena con la información que se trae de la base de datos, de forma que algunas celdas estarán rellenas y otras estarán vacías.

Y quieres que una celda rellena no se pueda editar (digamos que esté como bloqueada).

En cambio en una celda en blanco sí se podrían escribir datos, pero una vez se pasa a otra celda la celda donde acabamos de escribir datos ya tampoco debería poderse volver a editar. (Aquí se me plantea la duda: ¿y si hay una equivocación al introducir los datos? ¿y si se quiere cambiar un dato?)

Cuando el usuario quiera, guardaría los datos en la base de datos pulsando el botón correspondiente.


lucas1234

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:Ayuda con validacion de celda
« Respuesta #2 en: 20 de Marzo 2014, 09:21 »
Que tal Ogramar?
Cuando se da de alta un usuario, automaticamente algunos campos quedan vacíos.
La idea es que solo esos campos vacíos se puedan editar(los que tienen datos, estén bloqueados).
En un formulario aparte hará esto de cambiar valores en campos que no estén vacíos.
La parte de validar en mi código funciona a medias, esa parte de IsNullOrEmpty
Lo del datagrid y la base de datos es como vos decís

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Ayuda con validacion de celda
« Respuesta #3 en: 20 de Marzo 2014, 10:02 »
Hola, supongamos que das de alta a un usuario y quedan vacíos los campos "NumeroDeHermanos" y "NumeroDeHijos".

Ahora cargo el datagrid y esos campos están vacíos. Los edito, les pongo un valor y guardo. Ahora esos campos ya no están vacíos pero ¿se podrán seguir editando o ya no se podrán editar?

Es decir, lo que me pregunto es si los campos bloqueados son siempre los mismos o si van cambiando según vayamos rellenando.

lucas1234

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:Ayuda con validacion de celda
« Respuesta #4 en: 20 de Marzo 2014, 11:55 »
Perdón por no explicarme bien.

Cito: "Ahora cargo el datagrid y esos campos están vacíos. Los edito, les pongo un valor y guardo. Ahora esos campos ya no están vacíos pero ¿se podrán seguir editando o ya no se podrán editar?"
Ahora que están con un valor no se debería poder volver a 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

lucas1234

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Re:Ayuda con validacion de celda
« Respuesta #5 en: 21 de Marzo 2014, 01:11 »
En otro foro y gracias a Javinet encontré la solución. Lo comparto:

 
Código: [Seleccionar]
Private Sub DataGridView1_CellBeginEdit(sender As System.Object, e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit

        If String.IsNullOrEmpty(Me.DataGridView1.CurrentCell.Value.ToString.Trim) Then

            Me.bEdit = True

        Else

            e.Cancel = True
            MsgBox("Estimado usuari@ la celda que usted está intentando modificar ya tiene datos. Por favor elija otra. Muchas Gracias. xDD")

        End If

    End Sub
ya no fué necesario lo de validacion y lo de cellendedit
saludos

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Re:Ayuda con validacion de celda
« Respuesta #6 en: 21 de Marzo 2014, 08:34 »
Lo estaba mirando pero no daba con ello, gracias por compartir la solución!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".