none
Agregar consulta a Datagridview desde Textbox sin reemplazar la consulta anterior RRS feed

  • Pregunta

  • Buenas noches 

    Tengo una consulta, espero que puedan ayudarme 

    Tengo un datagridview que muestra el código, cantidad, descripción, marca, precio y total. Desde un textbox ingreso el código el cual hace una consulta a sql y me muestra los datos correctamente a excepción de cantidad que se ingresa manualmente después de cargar los datos. Hasta aquí funciona todo bien, el problema está cuando quiero agregar un segundo registro, me reemplaza la consulta anterior y lo que necesito es que se agregue al grid una nueva fila con la consulta, no que me la sustituya.

    Agrego el código de VB.NET con el cual hago la consulta y desde el evento KeyDown del textbox cargo los datos en el datagridview

      Sub GridFactura(ByVal dgv As DataGridView, ByVal label As Label, ByVal descripcion As String)
            Try
                cmd = New SqlCommand("Grid2Factura", cnn)
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Connection = cnn
                da = New SqlDataAdapter(cmd)
                cmd.Parameters.Add("@Descripcion", SqlDbType.VarChar).Value = descripcion
                dt = New DataTable
                da.Fill(dt)
                dgv.DataSource = dt

                'He probado con este código pero lo que hace es añadirme una nueva fila, en la columna descripción con el parámetro que ingreso de consulta desde el textbox y siempre reemplaza los datos anteriores
                'Dim row As DataRow = dt.NewRow
                'row("Descripcion") = descripcion
                'dt.Rows.Add(row)
                'dgv.DataSource = dt

            Catch ex As Exception
                MsgBox("Error " + ex.ToString)
            End Try
        End Sub

    miércoles, 6 de enero de 2016 1:09

Respuestas

  • "homesh16" escribió:

    > el problema está cuando quiero agregar un segundo registro, me reemplaza
    > la consulta anterior y lo que necesito es que se agregue al grid una nueva
    > fila con la consulta, no que me la sustituya.
    >
    >     dt = New DataTable
    >     da.Fill(dt)
    >     dgv.DataSource = dt

    Hola:

    Es normal que ello ocurra porque cada vez que llamas al procedimiento GridFactura estás creando un nuevo objeto DataTable y se lo estás enlazando al control DataGridView, con lo que en éste siempre aparecerá el último registro o factura obtenida.

    A mi manera de ver ésta cuestión, tu procedimiento Sub lo tienes que cambiar por un procedimiento Function, el cual te tiene que devolver un objeto DataRow con los datos de la factura obtenida:

        Private Shared Function ObtenerFactura(descripcion As String) As DataRow
    
            Dim dt As New DataTable()
    
            Using cnn As New SqlConnection(Escribe aquí la cadena de conexión)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "Grid2Factura"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@Descripcion", descripcion)
    
                Dim da As New SqlDataAdapter(cmd)
                da.Fill(dt)
            End Using
    
            If (dt.Rows.Count > 0) Then
                ' Devolvemos el primer registro obtenido.
                Return dt.Rows(0)
            End If
    
            ' No existen registros
            Return Nothing
    
        End Function
    

    Ahora, suponiendo que el control DataGridView ya lo tienes enlazado con un objeto DataTable, añadirías nuevas filas ejecutando el siguiente código:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Referenciamos el objeto DataTable enlazado con el control DataGridView
                '
                Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
                If (dt Is Nothing) Then
                    Throw New InvalidOperationException("El control DataGridView no está enlazado a un origen de datos válido.")
                End If
    
                ' Obtenemos la factura
                Dim row As DataRow = ObtenerFactura(TextBox1.Text)
                If (Not row Is Nothing) Then
                    ' Importamos la fila obtenida al objeto DataTable.
                    dt.ImportRow(row)

                Else
                    MessageBox.Show("No existen datos que coincidan con la descripción especificada.")
    End If Catch ex As Exception MessageBox.Show(String.Format("Error: {0}", ex.Message)) End Try End Sub

    Insisto que el control DataGridView tiene que estar enlazado a un objeto DataTable ANTES de hacer clic en el control Button1 para añadir una nueva fila, cuestión ésta que la has podido hacer tanto en tiempo de diseño como en tiempo de ejecución.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta LLTony miércoles, 6 de enero de 2016 19:32
    miércoles, 6 de enero de 2016 6:40
    Moderador

Todas las respuestas

  • "homesh16" escribió:

    > el problema está cuando quiero agregar un segundo registro, me reemplaza
    > la consulta anterior y lo que necesito es que se agregue al grid una nueva
    > fila con la consulta, no que me la sustituya.
    >
    >     dt = New DataTable
    >     da.Fill(dt)
    >     dgv.DataSource = dt

    Hola:

    Es normal que ello ocurra porque cada vez que llamas al procedimiento GridFactura estás creando un nuevo objeto DataTable y se lo estás enlazando al control DataGridView, con lo que en éste siempre aparecerá el último registro o factura obtenida.

    A mi manera de ver ésta cuestión, tu procedimiento Sub lo tienes que cambiar por un procedimiento Function, el cual te tiene que devolver un objeto DataRow con los datos de la factura obtenida:

        Private Shared Function ObtenerFactura(descripcion As String) As DataRow
    
            Dim dt As New DataTable()
    
            Using cnn As New SqlConnection(Escribe aquí la cadena de conexión)
                Dim cmd As SqlCommand = cnn.CreateCommand()
                cmd.CommandText = "Grid2Factura"
                cmd.CommandType = CommandType.StoredProcedure
                cmd.Parameters.AddWithValue("@Descripcion", descripcion)
    
                Dim da As New SqlDataAdapter(cmd)
                da.Fill(dt)
            End Using
    
            If (dt.Rows.Count > 0) Then
                ' Devolvemos el primer registro obtenido.
                Return dt.Rows(0)
            End If
    
            ' No existen registros
            Return Nothing
    
        End Function
    

    Ahora, suponiendo que el control DataGridView ya lo tienes enlazado con un objeto DataTable, añadirías nuevas filas ejecutando el siguiente código:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Try
                ' Referenciamos el objeto DataTable enlazado con el control DataGridView
                '
                Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
                If (dt Is Nothing) Then
                    Throw New InvalidOperationException("El control DataGridView no está enlazado a un origen de datos válido.")
                End If
    
                ' Obtenemos la factura
                Dim row As DataRow = ObtenerFactura(TextBox1.Text)
                If (Not row Is Nothing) Then
                    ' Importamos la fila obtenida al objeto DataTable.
                    dt.ImportRow(row)

                Else
                    MessageBox.Show("No existen datos que coincidan con la descripción especificada.")
    End If Catch ex As Exception MessageBox.Show(String.Format("Error: {0}", ex.Message)) End Try End Sub

    Insisto que el control DataGridView tiene que estar enlazado a un objeto DataTable ANTES de hacer clic en el control Button1 para añadir una nueva fila, cuestión ésta que la has podido hacer tanto en tiempo de diseño como en tiempo de ejecución.

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    • Marcado como respuesta LLTony miércoles, 6 de enero de 2016 19:32
    miércoles, 6 de enero de 2016 6:40
    Moderador
  • Muchas gracias Enrique

    Me funciona perfecto, había investigado en varios foros aquí pero ninguna me daba la solución que necesitaba.

    Saludos.

    miércoles, 6 de enero de 2016 19:36