none
Luego de realizar un filtrado en un Datagridview, quiero modificar y grabar un dato de la lista ya filtrada y no lo consigo... RRS feed

  • Pregunta

  • Hola Chicos!!!!

    Soy nuevo en esto de la programación. En este caso puntual estoy en VB.net trabajando. A duras penas a los ponchazos, o sea, de manera desprolija en términos de un correcto uso de los recursos de programación. Mezclando un poco de todo.

    La cuestión al fin y al cabo es: Tengo una tabla. Que la veo a través de un datagridview. Logro agregar registros nuevos desde otro formulario, logro eliminar filas desde el mismo datagridview y tambien modificar los datos del mismo datagridview. Logro también realizar filtros de la lista por Apellido y DNI. Pero el problema es que cuando filtro y obviamente se reduce el listado, o tan solo me queda 1. Quiero modificar un dato en ese momento, pero no queda guardado. Es decir, hago lo de siempre mientras tengo a la vista toda la lista para modificar (que eso si me funciona), pero en el momento en que ya esta filtrado no puedo.

    Estoy con esto como un mes mas o menos y no doy pie con bola! Estaría infinitamente agradecido si me dan una mano!

    Aca les dejo el código. y dicho sea de paso si me pueden "enseñar" viendo las mezclas y horrores bienvenido sea!!!!! Desde ya muchas gracias!!!! Leopoldo.

    Tengo las imágenes del código para subir pero me dice que tienen que verificar la cuenta o algo asi asi que les dejo el código a mano:

    Form1:

    Imports System.Data
    Imports System.Data.OleDb
    Public Class Form1
        Private traerdatosDataSet As New DataSet
        Private datosDataAdapter As New OleDbDataAdapter
        Private EditarFiltrando As String

        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            conectar()
            mostrarDatos()
        End Sub

        'Acá mostramos los datos en el datagridview
        Sub mostrarDatos()
            datosDataAdapter = New OleDbDataAdapter
            datosDataAdapter.SelectCommand = New OleDbCommand("select * from Alumnos", conexion)
            traerdatosDataSet = New DataSet
            datosDataAdapter.Fill(traerdatosDataSet, "Alumnos")
            DataGridView1.DataSource = traerdatosDataSet.Tables(0)
            DataGridView1.Columns("Id").Visible = False
            DataGridView1.ReadOnly = True
            traerdatosDataSet.Dispose()
            conexion.Close()
            'Acá mostramos todos los datos y al Datagridview lo dejamos con la opción que no se puede editar ningún valor
        End Sub

        'Acá agregamos datos de Alumno nuevo
        Private Sub ButtonAgregarAlumno_Click(sender As Object, e As EventArgs) Handles ButtonAgregarAlumno.Click
            Form2.Show()
        End Sub

        Private Sub ButtonEditar_Click(sender As Object, e As EventArgs)
            DataGridView1.ReadOnly = False
        End Sub

        Private Sub Filtrar_Apellido()
            'A partir de acá, el código es para filtrar la información del datagridview por Apellido
            Try
                If Not conexion.State = ConnectionState.Open Then
                    conectar()
                    'aca si no esta abierta la base de datos la abrimos
                End If
                Dim tablaDataAdapter = New OleDbDataAdapter("select * from Alumnos where APELLIDO like '" & (TextBoxFiltrarApellido.Text) & "%'", conexion)
                Dim almacenardatosDataSet As New DataSet
                tablaDataAdapter.Fill(almacenardatosDataSet, "Alumnos")
                DataGridView1.DataSource = almacenardatosDataSet.Tables("Alumnos")
                conexion.Close()
                'le pongo dataSet.Tables para que me muestre todas las filas, sino no me muestra ningún dato
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                'por si ocurre algún error que lo muestre
            End Try
        End Sub

        Private Sub Filtrar_Dni()
            'A partir de acá, el código es para filtrar la información del datagridview por DNI
            Try
                If Not conexion.State = ConnectionState.Open Then
                    conectar()
                    'aca si no esta abierta la base de datos la abrimos
                End If
                Dim tablaDataAdapter As New OleDbDataAdapter("select * from Alumnos where DNI like '" & (TextBoxFiltrarDni.Text) & "%'", conexion)
                Dim almacenardatosDataSet As New DataSet
                tablaDataAdapter.Fill(almacenardatosDataSet, "Alumnos")
                DataGridView1.DataSource = almacenardatosDataSet.Tables("Alumnos")
                conexion.Close()
                'le pongo dataSet.Tables para que me muestre todas las filas, sino no me muestra ningún dato
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                'por si ocurre algún error que lo muestre
            End Try
        End Sub

        Private Sub TextBoxFiltrarApellido_TextChanged_1(sender As Object, e As EventArgs) Handles TextBoxFiltrarApellido.TextChanged
            Filtrar_Apellido()
        End Sub

        Private Sub TextBoxFiltrarDni_TextChanged(sender As Object, e As EventArgs) Handles TextBoxFiltrarDni.TextChanged
            Filtrar_Dni()
        End Sub

        Private Sub DataGridView1_RowHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.RowHeaderMouseClick
            If DataGridView1.Rows.Count > 0 Then
                'tiene datos cargados
                If DataGridView1.SelectedRows.Count > 0 Then
                    'hay fila seleccionada y mostramos sus datos
                    TextBoxDniAlumno_Eliminar.Text = DataGridView1.SelectedRows(0).Cells("DNI").Value
                End If
            End If
        End Sub

        Private Sub ButtonEliminarAlumno_Click(sender As Object, e As EventArgs) Handles ButtonEliminarAlumno.Click
            If Not conexion.State = ConnectionState.Open Then
                conectar()
                'aca si no esta abierta la base de datos la abrimos
            End If
            If DataGridView1.SelectedRows.Count > 0 Then
                'hay filas seleccionadas
                Dim comand As New OleDbCommand
                comand.Connection = conexion
                comand.CommandText = "delete from Alumnos where DNI='" & TextBoxDniAlumno_Eliminar.Text & "'"

                Dim mensaje As String

                Dim titulo As String
                Dim estilo As MsgBoxStyle
                Dim respuesta As MsgBoxResult
                mensaje = ("Esta Seguro que desea Borrar al Alumno cuyo DNI es = '" & TextBoxDniAlumno_Eliminar.Text & "'")  'Define mensaje.
                estilo = MsgBoxStyle.DefaultButton2 Or MsgBoxStyle.Critical Or MsgBoxStyle.YesNo
               

    'paso a explicar el, el DefaultButton"2" significa que va a ver dos botones
                'El Critical es un símbolo de "Alerta" ojo que estas por hacer algo picante
                'Y por último YesNo significa que los nombres de los botones el 1ero "Yes", Segundo "No"

                titulo = "Esta por Eliminar un Alumno"   ' Define título del mensaje

                respuesta = MsgBox(mensaje, estilo, titulo) 'para saber cuál de los dos botones se presionaron
                If respuesta = MsgBoxResult.Yes Then   ' User chose Yes.
                    comand.ExecuteNonQuery()
                    MsgBox("Alumno Eliminado")
                    TextBoxFiltrarDni.Text = ""
                    TextBoxFiltrarApellido.Text = ""
                    TextBoxDniAlumno_Eliminar.Text = ""
                    mostrarDatos()
                    conexion.Close()
                Else
                    conexion.Close()
                End If
            Else
                MsgBox("No se ha seleccionado una fila")
            End If
        End Sub

        Private Sub ButtonEditarGuardar_Click(sender As Object, e As EventArgs) Handles ButtonEditar.Click
            DataGridView1.ReadOnly = False
        End Sub

        Private Sub ButtonGuardarEdicion_Click(sender As Object, e As EventArgs) Handles ButtonGuardarEdicion.Click
            Try
                If Not conexion.State = ConnectionState.Open Then
                    conectar()
                    'aca si no esta abierta la base de datos la abrimos
                End If
                Dim loco As OleDbCommandBuilder
                loco = New OleDbCommandBuilder(datosDataAdapter)
                datosDataAdapter.Update(traerdatosDataSet, "Alumnos")
                MsgBox("Se han Actualizado los Datos Modificados")
                'DataGridView1.Rows.Clear()
                'DataGridView1.DataSource = Nothing

                TextBoxFiltrarApellido.Text = ""
                TextBoxFiltrarDni.Text = ""

                conexion.Close()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    End Class

    Módulo cargar información

    Imports System.Data
    Imports System.Data.OleDb
    Module CargarInfo
        Public conexion As New OleDbConnection
        Public Sub conectar()
            conexion.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= D:\Escuela\Nuevo 2014\EMATP\Sistemas Visual Basic\Base de Datos\Base de Datos\bin\Debug\Basededatos.accdb"
            conexion.Open()
        End Sub
    End Module

    Form2:

    Imports System.Data
    Imports System.Data.OleDb
    Public Class Form2
        Public valor As String

        Sub VerificarDni_Repetido()
            If Not conexion.State = ConnectionState.Open Then
                conectar()
                'aca si no esta abierta la base de datos la abrimos
            End If
            Dim tablaDataAdapter As New OleDbDataAdapter("select * from Alumnos where DNI = ('" & TextBoxNuevoDni.Text & "')", conexion)
            Dim datset As New DataSet
            tablaDataAdapter.Fill(datset, "Alumnos")
            conexion.Close()
            If (datset.Tables(0).Rows.Count = 0) Then
                'no encontro otro DNI igual
                valor = "no"
            Else
                valor = "si"
            End If
            datset.Dispose()
        End Sub

        Private Sub ButtonGuardarAlumno_Click(sender As Object, e As EventArgs) Handles ButtonGuardarAlumno.Click
            Try
                VerificarDni_Repetido()
                If Not conexion.State = ConnectionState.Open Then
                    conectar()
                    'aca si no esta abierta la base de datos la abrimos
                End If
                If valor = "si" Then
                    MsgBox("El Alumno que desea ingresar ya se encuentra registrado")
                Else
                    Dim comand As New OleDbCommand
                    comand.Connection = conexion
                    comand.CommandText = "insert into Alumnos (APELLIDO,NOMBRES,DNI) values ('" & TextBoxNuevoApellido.Text & "', '" & TextBoxNuevoNombres.Text & "', '" & TextBoxNuevoDni.Text & "')"
                    comand.ExecuteNonQuery()
                    MsgBox("Alumno Cargado")
                    Form1.mostrarDatos()
                    conexion.Close()
                    Me.Close()
                End If
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
    End Class

    • Editado LeoMiracco viernes, 13 de junio de 2014 0:04
    • Cambiado Enrique M. Montejo lunes, 16 de junio de 2014 7:48 Pregunta relacionada con el acceso a datos.
    jueves, 12 de junio de 2014 23:55