none
Problemas al actualizar un combo box

    Pregunta

  • Hola alguien me puede ayudar por favor.Estoy trabajando con base de datos de access, y combo box que carga datos que tenga un id igual a un número; los datos se cargan bien, pero el problema esta cuando el combo box tiene un solo item que es un solo registro de la tabla y quiero eliminar, me elimina el registro pero en el combo box no se actualiza, tendria que quedar vacio.Me actualiza recien cuando salgo de la aplicación y eso no puede ser. En cambio si tengo varios registro no hay problema. Espero se entienda la pregunta.Aqui les dejo el código de como lleno el combo box y del boton eliminar
    Public Sub LLENARCOMBOX()
            CONECCION = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; data source = documentos\SELECTORHERRAMIENTAS.mdb")
            CONECCION.Open()
            Try
                PRUEBA = New OleDbDataAdapter("SELECT * FROM COMPONENTES where IDCATEGORIA = 15", CONECCION)
                TABLA = New DataSet
                PRUEBA.Fill(TABLA, "COMPONENTES")
                Me.ComboInstaladorSIMULAR.DataSource = TABLA.Tables("COMPONENTES").DefaultView
                Me.ComboInstaladorSIMULAR.DisplayMember = "CARPETA"
                Me.ComboInstaladorSIMULAR.ValueMember = "RUTA"
            Catch ex As Exception
                MsgBox(ex.ToString, MsgBoxStyle.Critical, "ERROR NO CONTROLADO")
    
            End Try
            CONECCION.Close()
        End Sub
    
     Private Sub BtnEliminar_Click(ByVal sender As System.Object, 
    ByVal e As System.EventArgs) Handles BtnEliminar.Click
            Try
                Dim direcotorioeliminar As String
                direcotorioeliminar = ruta & "\INSTALADORES\SIMULAR\" & ComboInstaladorSIMULAR.Text
                My.Computer.FileSystem.DeleteDirectory(direcotorioeliminar, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin, FileIO.UICancelOption.DoNothing)
                'ABRIR LA CONEXION 
                CONECCION = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; data source =documentos\SELECTORHERRAMIENTAS.mdb")
                'CREANDO Y CARGANDO UN OBJETO OLEBCOMMAND CON INSTRUCCION SQL DELETE
                Dim ELIMINA As String = "DELETE * FROM COMPONENTES WHERE CARPETA = @CARPETA"
                PRUEBA = New OleDbDataAdapter(ELIMINA, CONECCION)
                PRUEBA.SelectCommand.Parameters.Add(New OleDbParameter("@CARPETA", OleDbType.VarWChar, 50))
                PRUEBA.SelectCommand.Parameters("@CARPETA").Value = ComboInstaladorSIMULAR.Text
                'MANDANDO EL SQL A LA BASE DE DATOS
                TABLA = New DataSet
                PRUEBA.Fill(TABLA, "COMPONENTES")
                CONECCION = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; data source = documentos\SELECTORHERRAMIENTAS.mdb")
                CONECCION.Open()
                LLENARCOMBOX()
    
            Catch ex As Exception
                MsgBox(ex.Message.ToString, MsgBoxStyle.Critical)
            End Try
        End Sub
    martes, 27 de octubre de 2009 15:44

Respuestas

  • Hola:

    Si la variable objeto TABLA tiene un ámbito a nivel del formulario, ¿por qué creas una nueva instancia en el procedimiento BtnEliminar y posteriormente la vuelves a crear de nuevo en el procedimiento LlenarComboBox?

    De todas maneras, como es más fácil explicarte lo que tienes que hacer que averiguar lo que te está sucediendo, si lo crees conveniente, adapta a tus necesidades los siguientes procedimientos:

       Private connString As String = _
            "Provider = Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=C:\Mis documentos\Bd1.mdb"

        Private Sub LlenarComboBox()

            ' Rellenamos el control ComboBox con el nombre
            ' de los Clientes
            '
            Using cnn As New OleDbConnection(connString)

                Dim sql As String = _
                    "SELECT IdCliente, Nombre FROM Clientes"

                Dim da As New OleDbDataAdapter(sql, cnn)

                Dim dt As New DataTable("Clientes")

                da.Fill(dt)

                With ComboBox1
                    .DataSource = dt
                    .DisplayMember = "Nombre"
                    .ValueMember = "IdCliente"
                End With

            End Using

        End Sub

        Private Function EliminarRegistro(ByVal idCliente As Integer) As Boolean

            ' Rellenamos el control ComboBox con el nombre
            ' de los Clientes
            '
            Using cnn As New OleDbConnection(connString)

                Dim sql As String = _
                    "DELETE FROM Clientes " & _
                    "WHERE IdCliente =" & idCliente

                Dim cmd As New OleDbCommand(sql, cnn)

                Try
                    ' Abrimos la conexión
                    cnn.Open()

                    ' Ejecutamos el comando
                    '
                    cmd.ExecuteNonQuery()

                    Return True

                Catch ex As Exception
                    Return False

                End Try

            End Using

        End Function

    Ahora, cuando desees eliminar el Cliente número 4301587 ejecutarías:

           If EliminarRegistro(4301587) Then

                ' Si se ha eliminado, rellenamos el control ComboBox
                LlenarComboBox()

            Else
                MessageBox.Show("No se ha eliminado el registro.")

            End If

    Es decir, si la elminicación ha resultado satisfactoria, volvemos a llenar el control ComboBox.

    Por supuesto, al procedimiento LlenarComboBox lo puedes llamar cuando creas conveniente, por ejemplo, en el evento Load del formulario, para que se carge de datos cuando se muestre el formulario que lo contiene.

    Un saludo


    Enrique Martínez [MS MVP - VB]
    martes, 27 de octubre de 2009 16:04
    Moderador