none
Ocultar un proceso mientras se esta procesando RRS feed

  • Pregunta

  • buenas tardes a todos,

    Necesito ayuda en el siguiente punto, si hay alguien que puede ayudar, se lo agradecería mucho de antemanos,

    Tengo un form en donde exporto datos de un Datagridview a Excel, lo cual hasta ahí esta todo ok.

    Lo que necesito es que al dar clip en el boton de "exportar", se haga un conteo de todas las filas en el DGV y si las filas superan las 300 entonces que se exporte, pero que no muestre de inmediato el Excel si no hasta que ya entes cargados los datos en Excel, puesto que a como lo tengo a hora al dar clip en el boton "exportar"se muestra el Excel y se ve como el proceso que hace mi ciclo for agregando fila a fila del DGV a Excel y como sabrán entre mas filas haya en el DGV mas dilata este proceso de exportación y es precisamente esto lo que no quiero mostrarle al usuario....En pocas palabras quiero que se muestre el Excel hasta que ya este totalmente cargado los datos, mientras se este agregando las filas mostrar un Progresbar indicando que se esta ejecutando el proceso...

    el código de exportación que tengo es el siguiente.

     Public Sub ExportarDatosExcel(ByVal DataGridView1 As DataGridView, ByVal titulo As String)
            Dim m_Excel As New Excel.Application
            m_Excel.Cursor = Excel.XlMousePointer.xlNorthwestArrow
            m_Excel.Visible = False 
            Dim objLibroExcel As Excel.Workbook = m_Excel.Workbooks.Add
            Dim objHojaExcel As Excel.Worksheet = objLibroExcel.Worksheets(1)
            With objHojaExcel
                .Visible = Excel.XlSheetVisibility.xlSheetVisible
                .Activate()
                'Encabezado  
                .Range("A1:M1").Merge()
                .Range("A1:M1").Value = DateTime.Now.ToLongDateString()
                .Range("A1:M1").Font.Bold = True
                .Range("A1:M1").Font.Size = 15
                'Copete  
                .Range("A2:M2").Merge()
                .Range("A2:M2").Value = titulo
                .Range("A2:M2").Font.Bold = True
                .Range("A2:M2").Font.Size = 12
    
                Const primeraLetra As Char = "A"
                Const primerNumero As Short = 3
                Dim Letra As Char, UltimaLetra As Char
                Dim Numero As Integer, UltimoNumero As Integer
                Dim cod_letra As Byte = Asc(primeraLetra) - 1
                Dim sepDec As String = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
                Dim sepMil As String = Application.CurrentCulture.NumberFormat.NumberGroupSeparator
                'Establecer formatos de las columnas de la hija de cálculo  
                Dim strColumna As String = ""
                Dim LetraIzq As String = ""
                Dim cod_LetraIzq As Byte = Asc(primeraLetra) - 1
                Letra = primeraLetra
                Numero = primerNumero
                Dim objCelda As Excel.Range
                For Each c As DataGridViewColumn In DataGridView1.Columns
                    If c.Visible Then
                        If Letra = "Z" Then
                            Letra = primeraLetra
                            cod_letra = Asc(primeraLetra)
                            cod_LetraIzq += 1
                            LetraIzq = Chr(cod_LetraIzq)
                        Else
                            cod_letra += 1
                            Letra = Chr(cod_letra)
                        End If
                        strColumna = LetraIzq + Letra + Numero.ToString
                        objCelda = .Range(strColumna, Type.Missing)
                        objCelda.Value = c.HeaderText
                        objCelda.EntireColumn.Font.Size = 12
                        objCelda.RowHeight = 16
                        'objCelda.EntireColumn.NumberFormat = c.DefaultCellStyle.Format  
                        If c.ValueType Is GetType(Decimal) OrElse c.ValueType Is GetType(Double) Then
                            objCelda.EntireColumn.NumberFormat = "#" + sepMil + "0" + sepDec + "00"
                        End If
                    End If
                Next
    
                Dim objRangoEncab As Excel.Range = .Range(primeraLetra + Numero.ToString, LetraIzq + Letra + Numero.ToString)
                objRangoEncab.BorderAround(1, Excel.XlBorderWeight.xlMedium)
                UltimaLetra = Letra
                Dim UltimaLetraIzq As String = LetraIzq
    
                'CARGA DE DATOS  
                Dim i As Integer = Numero + 1
    
                For Each reg As DataGridViewRow In DataGridView1.Rows
                    LetraIzq = ""
                    cod_LetraIzq = Asc(primeraLetra) - 1
                    Letra = primeraLetra
                    cod_letra = Asc(primeraLetra) - 1
                    For Each c As DataGridViewColumn In DataGridView1.Columns
                        If c.Visible Then
                            If Letra = "Z" Then
                                Letra = primeraLetra
                                cod_letra = Asc(primeraLetra)
                                cod_LetraIzq += 1
                                LetraIzq = Chr(cod_LetraIzq)
                            Else
                                cod_letra += 1
                                Letra = Chr(cod_letra)
                            End If
                            strColumna = LetraIzq + Letra
                            ' acá cargamos los datos del DGV, tambien podemos dar formato a las celdas como el alto y ancho
                            .Cells(i, strColumna) = IIf(IsDBNull(reg.ToString), "", reg.Cells(c.Index).Value)
                            .Cells.RowHeight = 16
                            .Cells.Columns.AutoFit()
                        End If
                    Next
                    Dim objRangoReg As Excel.Range = .Range(primeraLetra + i.ToString, strColumna + i.ToString)
                    objRangoReg.Rows.BorderAround()
                    objRangoReg.Select()
    
                    i += 1
                Next
                UltimoNumero = i
    
                'Dibujar las líneas de las columnas  
                LetraIzq = ""
                cod_LetraIzq = Asc("A")
                cod_letra = Asc(primeraLetra)
                Letra = primeraLetra
                For Each c As DataGridViewColumn In DataGridView1.Columns
                    If c.Visible Then
                        objCelda = .Range(LetraIzq + Letra + primerNumero.ToString, LetraIzq + Letra + (UltimoNumero - 1).ToString)
                        objCelda.BorderAround()
                        If Letra = "Z" Then
                            Letra = primeraLetra
                            cod_letra = Asc(primeraLetra)
                            LetraIzq = Chr(cod_LetraIzq)
                            cod_LetraIzq += 1
                        Else
                            cod_letra += 1
                            Letra = Chr(cod_letra)
                        End If
                    End If
                Next
    
                'Dibujar el border exterior grueso  
                Dim objRango As Excel.Range = .Range(primeraLetra + primerNumero.ToString, UltimaLetraIzq + UltimaLetra + (UltimoNumero - 1).ToString)
                objRango.Select()
                objRango.Columns.AutoFit()
                objRango.Columns.BorderAround(1, Excel.XlBorderWeight.xlMedium)
    
            End With
            m_Excel.Cursor = Excel.XlMousePointer.xlNorthwestArrow
        End Sub

    Llamada al proceso.

     Private Sub btnexport_Click(sender As Object, e As EventArgs) Handles btnexport.Click
            Try
                'Call ExportarExcel(Me.ListView1)
                Call ExportarDatosExcel(Me.DataGridView1, "Inventario Generado")
            Catch ex As Exception
                FormMsgBoxError.Show(ex.Message, "Se produjo un error.")
            End Try
        End Sub



    martes, 26 de febrero de 2019 20:05

Respuestas

Todas las respuestas

  • Hola  Reynaldo002255

    Gracias por levantar tu consulta en los foros de MSDN. Con respecto a la misma, te hago la recomendación de ingresar al siguiente enlace en donde puedes encontrar una posible solución para tu problema.

    https://social.msdn.microsoft.com/Forums/es-ES/2ae70b6b-c75e-43d9-a36e-d390541759c4/ocultar-quotprocesoquot-de-mi-aplicaicon-del-administrador-de-tareas?forum=vbes

    Gracias por usar los foros de MSDN.

    Pedro Alfaro
     ____

    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.

    martes, 26 de febrero de 2019 21:12
    Moderador
  • Hola, básicamente quieres iniciar Excel de modo oculto y cuando termine de generar las filas, Excel debe ser mostrado.

    Para ello cuando inicias el componente Excel debes ocultarlo

    Dim m_Excel As New Excel.Application
    
    m_Excel.Visible = False;
    
    '' hacer proceso
    
    m_Excel.Visible = True


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Reynaldo002255 jueves, 28 de febrero de 2019 13:19
    miércoles, 27 de febrero de 2019 5:18
  • si, pero como se que ya se agregaron todas las filas como indicarle al usuario el progreso...

    algo como un BackgroundWorker

    miércoles, 27 de febrero de 2019 21:59
  • Puede ser. Ten en cuenta que sabes el número de filas que tienes en tu DGV. Emplea una barra de progreso que se vaya actualizando cada vez que se procese una fila del DGV. Procedimiento Establezca el valor mostrado por el Control ProgressBar de formularios de Windows

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    • Marcado como respuesta Reynaldo002255 jueves, 28 de febrero de 2019 13:19
    jueves, 28 de febrero de 2019 7:34