none
Borrar registro del Datagridview en VB y de la BD de SQL con ContextMenuStrip RRS feed

  • Pregunta

  • Buen dia, mi duda es la siguiente, tengo un datagridview en VB y al momento de darle click en el renglon me vacia los datos en varios textbox con el siguiente codigo:

     Private Sub datagridview1_SelectionChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles datagridview1.SelectionChanged
            Dim renglon As Integer = Me.datagridview1.CurrentCell.RowIndex

            Me.t1.Text = Me.datagridview1.Item(0, renglon).Value
            Me.t2.Text = Me.datagridview1.Item(1, renglon).Value
            Me.t3.Text = Me.datagridview1.Item(2, renglon).Value
            Me.t4.Text = Me.datagridview1.Item(3, renglon).Value
        End Sub

    Ahora cuando le doy click derecho y borrar del datagridview con el siguiente codigo:

    Private Sub BorrarToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BorrarToolStripMenuItem.Click
            Using con As New SqlClient.SqlConnection("server=SQLExpress;database=BD;Integrated Security=True")
                con.Open()

                Dim query As String = "DELETE FROM Alumnos WHERE nocontrol = @nc"
                Dim cmd As New SqlClient.SqlCommand(query, con)
                res = MessageBox.Show("Realmente desea borrar el Alumno?", "ALUMNOS", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation)
                sql = ""
                For Each row As DataGridViewRow In datagridview1.Rows
                    If res = vbYes Then
                        If row.Selected Then
                            cmd.Parameters.Clear()
                            cmd.Parameters.AddWithValue("@nc", CStr(row.Cells(0).Value))

                            cmd.ExecuteNonQuery()
                            Me.AlumnosTableAdapter.Fill(Me.EscuelaDataSet.Alumnos)
                        End If
                    End If
                Next

            End Using
        End Sub

    Me aparece el siguiente error:

    NullReferenceException was unhandled by user code
    Referencia a objeto no establecida como instancia de un objeto

    Si le quito la opcion de seleccionar renglon y mostrar en datagridview no me marca error pero me piden que haga eso!

    En que estoy mal o como me podrian ayudar porfa!

    martes, 29 de enero de 2013 14:42

Todas las respuestas

  • ¿Cuál línea de código arroja la excepción?

    Jose R. MCP
    Code Samples

    martes, 29 de enero de 2013 15:40
  • Dim renglon As Integer = Me.datagridview1.CurrentCell.RowIndex

    Esa!

    Si le quito el evento SelectionChanged del datagridview no me aparece el error y si borra normalmente, pero lo que quiere mi jefe es que al seleccionar el renglon, no una celda me muestre en diferentes textbox la informacion que se encuentra en cada celda... hay otro evento en el cual seleccione el renglon y me muestre los datos...

     

    Saludos!

    martes, 29 de enero de 2013 15:51
  • de echo estoy verificando y si me muestra el renglon seleccionado cuando hago click antes de la primer celda, sin embargo si me muevo con las flechas arriba y abajo del teclado no me las muestra como en el evento selectionchanged....
    martes, 29 de enero de 2013 15:55
  • Ok, el problema estrictamente hablando es que cuando ese evento se ejecuta la propiedad CurrentCell es nula.

    Pero debo hacerle notar que está reinventando la rueda.  Lo que usted necesita hacer es hacer uso de la vinculación a datos de Windows Forms.  Arrastre un BindingSource desde la barra de herramientas y úsela como DataSource para el DGV y todos esos textboxes.  Luego cargue los datos desde base de datos y asígnelos como DataSource del BindingSource.  Todo se actualizará automáticamente.  Todo.  El DGV, los textboxes.  Todo.  No tiene por qué escribir código para eso.  Deshágase de ese SelectionChanged.


    Jose R. MCP
    Code Samples

    martes, 29 de enero de 2013 16:09
  • La verdad nunca e usado el BindingSource, no sabria como hacer la conexion que me menciona :/ de igual manera le sigo buscando y buscare como hacer lo que me dice y asi ver como hacer esto!

    Gracias.

    martes, 29 de enero de 2013 16:22
  • Pues hoy será el día que aprenda.  Pero es demasiado sencillo.  Aprenderá en 10 minutos.

    1. BindingSource al Form desde el toolbox.
    2. Asignar BindingSource como fuente de datos de todos los controles (agregar columnas al DGV manualmente).
    3. Por código, cargar datos desde base de datos en un List<T> o un DataTable (que no es bueno, pero está bien por ahora para que aprenda a pasos cortos).
    4. Asignar el List<T> o el DataTable del punto anterior a la propiedad DataSource del BindingSource.
    5. ¡Voilá!  Todo el mundo mostrando datos sincronizadamente sin necesidad de codificar nada en el SelectionChanged del DGV.

    Jose R. MCP
    Code Samples

    martes, 29 de enero de 2013 16:35
  • pues le estoy intentando de esta manera y se me complica mucho... en mi codigo no habra una linea que se pueda remover o cambiar?

    Donde se vuelve a ciclar es porque vuelvo a actualizar despues de borrar y cuando debugeo y sigo con f11 despues del error si me realiza el movimiento pero tengo que debugear como podria hacerle!! :(

    martes, 29 de enero de 2013 17:43
  • de echo si realizo una nueva alta desde botones y luego borro si me lo permite,

    mi jefe me dijo que creara una condicion si la linea que me marca error es Nothing ya que eso me aparece cuando intento borrar una linea que no haga el procedimiento, ayudaa no le entiendo!!

    martes, 29 de enero de 2013 18:34