C sharp - Mostrar el progreso de un proceso desde una biblioteca de clases

 
Vista:
sin imagen de perfil
Val: 2
Ha disminuido su posición en 15 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por Vladimir Gastelum (6 intervenciones) el 07/01/2024 22:59:40
Buen día tengo una solución en C Sharp con 4 proyectos relacionados entre si (Capa de Datos, Capa de Negocios, Capa de Entidades y Capa de Usuario o Presentación).

En la capa de usuario, el cual es el proyecto inicial en un formulario mando guardar por medio de un DataTable una gran cantidad de registros y quiero tener un control del progreso de la inserción de registros a través de una barra de progreso y no se como hacerlo.

El proyecto de la capa de usuarios (Proyecto de Windows Form) tiene acceso a la capa de negocios (Proyecto de Biblioteca de Clases) y desde la capa de negocios accedo a la capa de datos (que también es un proyecto de tipo biblioteca de clases). Esta capa de datos es en donde me conecto a la base de datos y desde ahí agrego los registros a la base de datos. Mi pregunta y mi duda es ¿Cómo desde la capa de usuarios puedo mostrar esa barra de progreso, para que el usuario vea proceso de la inserción de registros?

Espero me haya explicado y sobre todo me puedan ayudar.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por manuel (6 intervenciones) el 14/01/2024 05:46:01
Hola, perdón por responder un poco tarde. ¿Dijiste que tienes 4 capas de datos (Datos, Negocios, Entidades y Presentacion) en tu solución y quieres mostrar una barra de progreso cuando haces la carga desde la capa de Presentación con un DataTable verdad? ¿El DataTable lo cargas con la lista de datos y eso se lo pasas a algún store procedure para que te los cargue en la base de datos o cómo es que cargas a los datos en la base? Eso último no entendí. Yo tengo un ejemplo de un crud que una stores procedures para hacer los inserts, pero no uso un DataTable sino que uso una lista estatica y voy haciendo los inserts a medida que recorro la lista. Por ahí podría llegar a servirte. Uso dos componentes para eso, un BackgroundWorker y un ProgressBar.

El resultado es algo así mira:

CargaConBarraDeProgreso

Dime si te puede llegar a servir.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2
Ha disminuido su posición en 15 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por Vladimir (6 intervenciones) el 19/01/2024 00:24:00
si me sirve.

Podrás pasarme el ejemplo por favor

gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por manuel (6 intervenciones) el 20/01/2024 04:23:52
Dale, perdón, recién leo el mensaje. Te paso el proyecto, para que te ande primero tenes que ejecutar el script "Create_DB_And_SP.sql", para crear la base de datos SQL Server y los stores procedures que usa el aplicativo.

El archivo que tenes que adaptar es el "Form1.cs" que usa el BackgroundWorker y el ProgressBar. Lo copio acá para pero esta en el .zip
Revisa estos métodos.

- btnGuardarLista_Click
- backgroundWorker1_DoWork
- backgroundWorker1_ProgressChanged
- backgroundWorker1_RunWorkerCompleted

Y fijate como cuando se va haciendo el insert vas aumentando la barra de progreso con "progressBar1.Value = e.ProgressPercentage;".

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public partial class Form1 : Form
{
    // otro codigo...
 
    private void btnGuardarLista_Click(object sender, EventArgs e)
    {
        if (productos.Count > 0)
        {
            try
            {
                btnGuardarLista.Enabled = false;
                progressBar1.Visible = true;
                lblProgreso.Show();
 
                backgroundWorker1.RunWorkerAsync();
 
                //objetoCN.InsertarListaProd(productos);
                //MostrarProdctos();
                //limpiarForm();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error al ejecutar 'InsertarProductos': " + ex);
            }
        }
    }
 
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        //objetoCN.InsertarListaProd(productos);
        int i = 0;
        foreach (Producto item in productos)
        {
            if (i % 2 == 0)
            {
                System.Threading.Thread.Sleep(500); // 1 seg por cada 2 inserts
            }
 
            objetoCN.InsertarPRod(
                item.Nombre,
                item.Descripcion,
                item.Marca,
                item.Precio,
                item.Stock
                );
 
            //int progreso = (i + 1) * 100 / productos.Count;
            int progreso = (i + 1) * 100 / productos.Count;
            backgroundWorker1.ReportProgress(progreso);
            i += 1;
        }
    }
 
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }
 
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        btnGuardarLista.Enabled = true;
        progressBar1.Visible = false;
        lblProgreso.Hide();
 
        MessageBox.Show($"Se agregaron {productos.Count} productos!");
        productos.Clear();
 
        MostrarProdctos();
    }
}

Cualquier cosa avisame si lo llegasa adaptar a tu proyecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2
Ha disminuido su posición en 15 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por Vladimir (6 intervenciones) el 21/01/2024 13:44:46
Muchas gracias lo implementare en mi codigo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2
Ha disminuido su posición en 15 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por Vladimir (6 intervenciones) el 29/01/2024 23:51:39
Ya probe lo que me mandastes algo asi quiero pero que todo eso lo haga pero en una biblioteca de clases.

Vuelvo a explicarlo.

Tengo una solucion con 4 proyectos: Datos, Negocio, Entidades y Presentacion.

En el proyecto presentacion es un windows form. Aqui tengo un formulario donde el usuario puede cargar un archivo de excel y los registros de este archivo los agrego a un datagridview.

Despues de esto el usuario hace un clic sobre un boton. En el evento de ese boton hago lo siguiente:

Instancio a la capa de negocios y mando llamar un metodo que se llama Importar y le mando como parametro el datagridiew y la capa de negocios accede a la capa de datos y dentro de esta capa (capa de datos) se hace todo el proceso. Explico lo que hago en la capa de datos.

Paso 1: Me conecto a la base de datos
Paso 2: Hago un foreach para recorrer todos los registro del datagrid
Paso 3: Tomo los valores de el row actual y creo la sentencia SQL
Paso 4. Ejecuto la sentencia SQL

Y es aqui donde quiero controlar el progres bar y que se muestre en el formulario, pero no se como hacerlo. El ejemplo que me pasastes esta perfecto solo que no se como hacerlo en la capa de datos. ¿Podras ayudarme? Te lo agradeceria mucho si me ayudaras con este asunto.

Gracias, espero y me haya explicado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por manuel (6 intervenciones) el 30/01/2024 22:31:38
Hola, que bueno que te sirvió lo que te pase. En verdad no creo que este del todo bien que quieras manejar el progreso de la barra de carga en la capa de Datos (CD) eso más bien debería ser trabajo de la capa de Presentación (CP). Aún así si quieres seguir con ese criterio lo único que se me ocurre es que definas en tu CD 3 metodos y 2 propiedades así.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class CapaDatos
{
    ProgressBar progressBar { get; set; }
    BackgroundWorker backGroundWorker { get; set; }
 
    public void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        // ...
    }
 
    public void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // ...
    }
 
    public void BackgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        // ...
    }
 
    // ...
}

Luego nomás los tienes que asignar en el constructor del formulario:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Form.cs
public Form1()
{
    InitializeComponent();
 
    // Seteo los metodos del BackGroundWorker de mi Form
    backgroundWorker1.DoWork += capaNegocio.getCapaDatos().BackgroundWorker1_DoWork;
    backgroundWorker1.ProgressChanged += capaNegocio.getCapaDatos().BackgroundWorker1_ProgressChanged;
    backgroundWorker1.RunWorkerCompleted += capaNegocio.getCapaDatos().BackgroundWorker1_RunWorkerCompleted;
 
    // Paso las referencias del BackGroundWorker y el ProgressBar a la Capa de Datos
    capaNegocio.getCapaDatos().progressBar = progressBar1;
    capaNegocio.getCapaDatos().backGroundWorker = backgroundWorker1;
}

Luego en tu CD ya tienes todo lo necesario para manejar el estado de la carga de la barra de progreso. Fijate del ejemplo que te había pasado antes, es muy similar. Repito, no creo que sea el mejor enfoque hacerlo de esa manera pero bueno. Cualquier cosa me dices y vemos que hacer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2
Ha disminuido su posición en 15 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por Vladimir (6 intervenciones) el 01/02/2024 23:35:16
Muchas gracias

Lo revisare

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Mostrar el progreso de un proceso desde una biblioteca de clases

Publicado por manuel (6 intervenciones) el 14/01/2024 18:32:26
Bueno, subo otra imagen GIF animada para que se pueda ver bien la función al cargar los datos, en mi caso desde una lista estatica que va haciendo los inserts. Agregue un retraso de 1/2 segundo por cada 2 inserts porque sino la barra casi no se muestra ya que la carga en la db se hace muy rápido.

Video-2024-01-14-142451
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar