none
BackgroundWorker con progress bar RRS feed

  • Pregunta

  • Buenos dias

    El motivo de mi consulta es la siguiente:

    tengo un formulario donde cargo un libro de Excel en un datagridview de la siguiente manera:

    Sub CargarOrdenesGrilla() Try Dim openFileDialog1 As New OpenFileDialog openFileDialog1.InitialDirectory = "C:\" openFileDialog1.Filter = "Archivos de Microsoft Office Excel (*.xls)|*.xls" If openFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then TxtRutaOrdenes.Text = openFileDialog1.FileName Dim cadconex As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & TxtRutaOrdenes.Text.Trim & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""" Dim cn As New OleDbConnection(cadconex) Dim cmd As New OleDbCommand Dim da As New OleDbDataAdapter Dim dt As New DataTable cmd.Connection = cn cmd.CommandText = "select * from [Ordenes$]" cmd.CommandType = CommandType.Text da.SelectCommand = cmd da.Fill(dt) DgvOrdenes.DataSource = dt DgvOrdenes.AutoSizeColumnsMode = 6 End If Catch ex As Exception MsgBox("Error en: " & ex.Message, MsgBoxStyle.Information, "Error Interno") End Try End Sub

    Private Sub BtnCargarArchivoExcel_Click(sender As Object, e As EventArgs) Handles BtnCargarArchivoExcel.Click
            CargarOrdenesGrilla()
    End Sub

    Luego usando el componente BackgroundWorker guardo esos datos que se cargaron en el datagridview en una base de datos de sql de la siguiente manera:

    Private Function GuardarOrdenesDesdeExcel() As Integer
            Try
                Dim DataTableOrdenes As DataTable = DgvOrdenes.DataSource
                Dim SQLSelect As String = String.Empty
    
                For Each DatosOrdenesDR As DataRow In DataTableOrdenes.Rows
                    Dim CodProceso As Integer = DatosOrdenesDR.Item(0)
                    Dim OrdenTrabajo As String = DatosOrdenesDR.Item(1)
                    Dim FechaEjecucion As String = DatosOrdenesDR.Item(2)
                    Dim HoraInicio As String = DatosOrdenesDR.Item(3)
                    Dim HoraFin As String = DatosOrdenesDR.Item(4)
                    Dim Nic As String = DatosOrdenesDR.Item(5)
                    Dim Nis As String = DatosOrdenesDR.Item(6)
                    Dim Municipio As Integer = DatosOrdenesDR.Item(7)
                    Dim Barrio As Integer = DatosOrdenesDR.Item(8)
                    Dim Direccion As String = DatosOrdenesDR.Item(9)
                    Dim Cuadrilla As Integer = DatosOrdenesDR.Item(10)
                    Dim Observaciones As String = DatosOrdenesDR.Item(11)
                    Dim Ip As String = DatosOrdenesDR.Item(12)
                    Dim Host As String = DatosOrdenesDR.Item(13)
                    Dim FechaRegistro As String = DatosOrdenesDR.Item(14)
                    Dim Cartera As Integer = DatosOrdenesDR.Item(15)
                    Dim UbicacionMedidor As Integer = DatosOrdenesDR.Item(16)
    
    
    
                    SQLSelect = "EXECUTE TEMPCopiaOrdenesAExcelSP " & CodProceso & ",'" &
                                                                   OrdenTrabajo & "','" &
                                                                   FechaEjecucion & "','" &
                                                                   HoraInicio & "','" &
                                                                   HoraFin & "','" &
                                                                   Nic & "','" &
                                                                   Nis & "'," &
                                                                   Municipio & "," &
                                                                   Barrio & ",'" &
                                                                   Direccion & "'," &
                                                                   Cuadrilla & ",'" &
                                                                   Observaciones & "','" &
                                                                   Ip & "','" &
                                                                   Host & "','" &
                                                                   FechaRegistro & "'," &
                                                                   Cartera & "," &
                                                                   UbicacionMedidor & ""
    
    
                    dt = Datos.qryDT(SQLSelect)
                Next
    
                If dt.Rows(0).Item(0) = 1 Then
                    MsgBox("Las Ordenes se Insertaron Correctamente", MsgBoxStyle.Information, "Ordenes")
    
                Else
                    'If dt.Rows(0).Item(0) = 2 Then
                    '    MsgBox("Las Ordenes Se actualizaron Correctamente...", MsgBoxStyle.Information, "Ordenes")
                    'Else
                    MsgBox("No se Insertaron las Ordenes...", MsgBoxStyle.Information, "Aviso")
                    'End If
                End If
    
                Return dt.Rows(0).Item(0)
                DataTableOrdenes = Nothing
            Catch ex As Exception
                MsgBox("Error en: " & ex.Message, MsgBoxStyle.Information, "Error Interno")
                Return 0
            End Try
    
        End Function


    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
            GuardarOrdenesDesdeExcel()
        End Sub
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
            If e.Error IsNot Nothing Then
                MessageBox.Show("Se ha producido un error durante la ejecución: " & e.Error.Message)
            End If
        End Sub


    Private Sub FrmImpotarExcelOrdenes_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            BackgroundWorker1.WorkerReportsProgress = True
            BackgroundWorker1.WorkerSupportsCancellation = True
        End Sub

    La aplicación no tiene problema y guarda los registros en la BD correctamente, lo que quisiera es insertar una progress bar para ver el proceso de guardado. 

    espero por favor me ayuden

    gracias de antemano

    Cordialmente,

    Ivan Mauricio Marin



    Ivan Mauricio Marin

    miércoles, 28 de noviembre de 2018 16:35

Respuestas

  • Creo que ni Microsoft tiene claro como hacer esto que pides, aun y que en primer plano es sencillo ya en segundo plano ha habido muchos intentos y métodos por lograrlo, al final lo mas sencillo es (así veo que lo hace Microsoft) es mostrar un gif animado en primer plano mientras en segundo plano se ejecuta tu función o método.

    Los gif animados van desde barras que caminan de izquierda a derecha o círculos a dar vueltas, etc pero sin mostrar avance, y esto solo para que el cliente vea que el sistema esta trabajando y no esta trabado.

    Yo te recomiendo que antes de llamar al segundo plano primero bloques todos los controles visibles del formulario y pongas visible tu gif animado, luego en RunWorkerCompleted ocultes el gif animado y pongas de nuevo Enabled = true todos los controles visibles en tu formulario.

    De esta forma evitaras que el cliente de clic a algún control que desate otra función.

    Saludos

    • Marcado como respuesta magus_caligula viernes, 30 de noviembre de 2018 19:07
    viernes, 30 de noviembre de 2018 18:01

Todas las respuestas

  • Hola  magus_caligula

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te comento que nos encontramos realizando la revisión del inconveniente que presentas.

    Te daremos una respuesta a la brevedad posible.

    Gracias por usar los foros de MSDN.

    Pablo Rubio
     ____

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde. 

    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.  

    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.
    miércoles, 28 de noviembre de 2018 18:34
  • Creo que ni Microsoft tiene claro como hacer esto que pides, aun y que en primer plano es sencillo ya en segundo plano ha habido muchos intentos y métodos por lograrlo, al final lo mas sencillo es (así veo que lo hace Microsoft) es mostrar un gif animado en primer plano mientras en segundo plano se ejecuta tu función o método.

    Los gif animados van desde barras que caminan de izquierda a derecha o círculos a dar vueltas, etc pero sin mostrar avance, y esto solo para que el cliente vea que el sistema esta trabajando y no esta trabado.

    Yo te recomiendo que antes de llamar al segundo plano primero bloques todos los controles visibles del formulario y pongas visible tu gif animado, luego en RunWorkerCompleted ocultes el gif animado y pongas de nuevo Enabled = true todos los controles visibles en tu formulario.

    De esta forma evitaras que el cliente de clic a algún control que desate otra función.

    Saludos

    • Marcado como respuesta magus_caligula viernes, 30 de noviembre de 2018 19:07
    viernes, 30 de noviembre de 2018 18:01
  • Eres muy amable por tu respuesta, voy a implementarlo según tu recomendacion

    gracias y buena tarde


    Ivan Mauricio Marin

    viernes, 30 de noviembre de 2018 19:08