none
BackGroundWorker con progress bar RRS feed

  • Pregunta

  • Code Snippet

    Codigo :


    ArrayList resultadosComprados = registro.BuscarRutasCompradas(codigoPromotorBuscar, this.txtCalleRuta.Text.Trim(), altura.Trim(), this.cbComuna.Text.Trim());
    ArrayList resultadosVendedores = registro.buscarNombrePromotor();
    ArrayList resultadosTida = registro.TipoDeDato();
    lvResultados.Items.Clear();
    pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;
    //pbRutas.Location = new System.Drawing.Point(8, 312);
    pbRutas.Step = 1;
    //pbRutas.Size = new System.Drawing.Size(520, 40);
    foreach (Dominio.CCTARE dire in resultadosComprados)
    {


    lvItem = new ListViewItem(dire.NombreCalle);
    lvItem.SubItems.Add(dire.Altura.ToString().Trim());
    lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
    lvItem.SubItems.Add(dire.Comuna);
    lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
    lvItem.SubItems.Add(dire.NombreVendedor);
    lvItem.SubItems.Add(dire.Estado.ToString());
    this.lvResultados.Items.Add(lvItem);

    pbRutas.PerformStep();
    }



    tengo funcionando ese progressbar

    ahora lo que quiero ( si es posible ) agregar un BackGroundWorker

    si alguien pudiese ayudarme

    desde ya muchas gracias Big Smile!
    lunes, 1 de septiembre de 2008 14:21

Respuestas

  • :-)

    Hola,

     

    Las expresiones lambda son de C# 3.0, con lo cual aparecen con VS2008.

    Es posible que estés usando una versión anterior?

     

    Si es así deberemos crear explícitamente el delegado:

    Aplica estos cambios:

     

    delegate void RefreshProgressDelegate(decimal percent);
     
    public void RefreshProgress(decimal value)
    {
        if (this == null) return;
        progressBar.Value = (int)value;
    }
     
    private void DoProcess()
    {
        for (int i = 0; i <= valueUpDown.Value; i++)
        {
            System.Threading.Thread.Sleep(10);
            var percent = (i / valueUpDown.Value) * 100;
            this.Invoke(new RefreshProgressDelegate(RefreshProgress),percent);
        }
        currentThread = null;
    }

     

    Saludos,

    martes, 2 de septiembre de 2008 15:08
    Moderador

Todas las respuestas

  • A ver si te entiedo lo que quieres decir con backgroundworker , es lograr que esos se realice sin que bloquee la interfaz , si es asi lo que tenes que hacer es lo siguiente:

    private delegate void ProcessDelegate();

    private void ProcessBackground()
    {
    if (formuario.InvokeRequiered)
    formulario.Invoke(new ProcessDelegate(ProcessBackground));
    else
    {
    ArrayList
    resultadosComprados =
    registro.BuscarRutasCompradas(codigoPromotorBuscar,
    this.txtCalleRuta.Text.Trim(), altura.Trim(),
    this.cbComuna.Text.Trim());
    ArrayList resultadosVendedores = registro.buscarNombrePromotor();
    ArrayList resultadosTida = registro.TipoDeDato();
    lvResultados.Items.Clear();
    pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;
    //pbRutas.Location = new System.Drawing.Point(8, 312);
    pbRutas.Step = 1;
    //pbRutas.Size = new System.Drawing.Size(520, 40);
    foreach (Dominio.CCTARE dire in resultadosComprados)
    {


    lvItem = new ListViewItem(dire.NombreCalle);
    lvItem.SubItems.Add(dire.Altura.ToString().Trim());
    lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
    lvItem.SubItems.Add(dire.Comuna);
    lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
    lvItem.SubItems.Add(dire.NombreVendedor);
    lvItem.SubItems.Add(dire.Estado.ToString());
    this.lvResultados.Items.Add(lvItem);

    pbRutas.PerformStep();
    }
    }

    }

    debes hacer esto en una clase aparte del formulario por que sino se te sigue bloqueando.
    lunes, 1 de septiembre de 2008 15:32
  • mm no entendi mucho Sad!

    lo q mas me interesa hacer q mientras se busca se vallan agregando los registros al listview y kede habilitada la interfaz ;(!
    lunes, 1 de septiembre de 2008 16:21
  • ok, si el codigo que te pase te sirve pero eso pon en una clase y en el constructor le pasas el m_Frm  y el listview , la clase te quedaria algo asi:

    public class Process
    {
        private Form m_Frm ;
        private ListView m_Lst;
        public Process(Form Container, ListView lst)
            {
                m_Frm =Container;   
                m_Lst=lst;
            }
    internal Void IniciarProceso()
    {
        Thread th = new Thread(new ThreadStart(
    ProcessBackground));
        th.Start();
    }
    internal void ProcessBackground()
    {
    if (formuario.InvokeRequiered)
    m_Frm .Invoke(new ProcessDelegate(ProcessBackground));
    else
    {
    ArrayList
    resultadosComprados =
    registro.BuscarRutasCompradas(codigoPromotorBuscar,
    this.txtCalleRuta.Text.Trim(), altura.Trim(),
    this.cbComuna.Text.Trim());
    ArrayList resultadosVendedores = registro.buscarNombrePromotor();
    ArrayList resultadosTida = registro.TipoDeDato();
    lvResultados.Items.Clear();
    pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;
    //pbRutas.Location = new System.Drawing.Point(8, 312);
    pbRutas.Step = 1;
    //pbRutas.Size = new System.Drawing.Size(520, 40);
    foreach (Dominio.CCTARE dire in resultadosComprados)
    {



    m_Lst.SubItems.Add(dire.Altura.ToString().Trim());
    m_Lst.SubItems.Add(dire.UbicacionesCompra.ToString());
    m_Lst.SubItems.Add(dire.Comuna);
    m_Lst.SubItems.Add(dire.FechaContrato.ToShortDateString());
    m_Lst.SubItems.Add(dire.NombreVendedor);
    m_Lst.SubItems.Add(dire.Estado.ToString());
    this.lvResultados.Items.Add(m_Lst);

    pbRutas.PerformStep();
    }
    }

    }
    private delegate void ProcessDelegate();
    }



    los datos de los textbox y otros que implique objetos los deberias pasar como parametros. por que los controles no estan definidos en esta clase.
    lunes, 1 de septiembre de 2008 18:22
  • entonces en el boton de mi clase le pongo

    clase.form2(FrmBuscar, LvResultados); ??



    y como

    if (formuario.InvokeRequiered) ahi va mi formulario??

    al llamar a esa clase se me llenara el lsitview Stick out tongue?
    lunes, 1 de septiembre de 2008 19:02
  •  private RutaSQL registro = new RutaSQL();
                private Form m_Frm;
                private ListView m_Lst;
            public Process(Form Container, ListView lst)
                {
                    m_Frm = Container;
                    m_Lst = lst;
                }
                internal void IniciarProceso()
                {
                    Thread th = new Thread(new ThreadStart(ProcessBackground));
                    th.Start();
                }
                internal void ProcessBackground()
                {
                    FrmBaseRuta frm = new FrmBaseRuta();
                   
                    if (frm.InvokeRequired)
                        m_Frm.Invoke(new ProcessDelegate(ProcessBackground));
                    else
                    {

                        ArrayList resultados = registro.BuscarTodasRutas(0);
                        ArrayList resultadosVendedores = registro.buscarNombrePromotor();
                        ArrayList resultadosTida = registro.TipoDeDato();
                        m_Lst.Items.Clear();
                        //pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;
                        //pbRutas.Location = new System.Drawing.Point(8, 312);
                        //pbRutas.Step = 1;
                        //pbRutas.Size = new System.Drawing.Size(520, 40);
                        ListViewItem lvItem = new ListViewItem();
                        foreach (Dominio.CCTARE dire in resultados)
                        {



                            lvItem.SubItems.Add(dire.Altura.ToString().Trim());
                            lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
                            lvItem.SubItems.Add(dire.Comuna);
                            lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
                            lvItem.SubItems.Add(dire.NombreVendedor);
                            lvItem.SubItems.Add(dire.Estado.ToString());
                            m_Lst.Items.Add(lvItem);

                            //pbRutas.PerformStep();
                        }
                    }

                }
                private delegate void ProcessDelegate();
            }

    eso me kedo, ahora como lo llamo desde la interfaz con el boton y para q me carge el progress bar??
    lunes, 1 de septiembre de 2008 19:53
  • :-)

    Hola,

     

    Ni siquiera necesitas un BackgroundWorker. Basta con crear un thread y luego actualizar el valor del progressbar mediante invoke y un delegado (o una expresión lambda que sustituya al delegado):

     

    public partial class Form1 : Form
    {
        System.Threading.Thread currentThread;
     
        public Form1()
        {
            InitializeComponent();
        }
        
        public void RefreshProgress(decimal value)
        {
            if (this == null) return;
            Invoke(new Action(() => progressBar.Value = (int)value));
        }
     
        private void startButton_Click(object sender, EventArgs e)
        {
            Start();
        }
     
        private void stopButton_Click(object sender, EventArgs e)
        {
            Stop();
        }
     
        private void Start()
        {
            if (currentThread == null)
            {
                currentThread = new System.Threading.Thread(DoProcess);
                currentThread.Start();
            }
        }
     
        private void Stop()
        {
            if (currentThread != null)
            {
                currentThread.Abort();
                currentThread = null;
                progressBar.Value = 0;
            }
        }
     
        private void DoProcess()
        {
            for (int i = 0; i <= valueUpDown.Value; i++)
            {
                System.Threading.Thread.Sleep(10);
                var percent = (i / valueUpDown.Value) * 100;
                RefreshProgress(percent);
            }
            currentThread = null;
        }
     
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            Stop();
        }
     
    }

     

    Saludos,

    martes, 2 de septiembre de 2008 7:37
    Moderador
  • Code Snippet

    ArrayList
    resultadosComprados =
    registro.BuscarRutasCompradas(codigoPromotorBuscar,
    this.txtCalleRuta.Text.Trim(), altura.Trim(),
    this.cbComuna.Text.Trim());
    ArrayList resultadosVendedores = registro.buscarNombrePromotor();
    ArrayList resultadosTida = registro.TipoDeDato();
    lvResultados.Items.Clear();
    //pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;
    //pbRutas.Location = new System.Drawing.Point(8, 312);
    //pbRutas.Step = 1;
    //pbRutas.Size = new System.Drawing.Size(520, 40);

    Star();
    foreach (Dominio.CCTARE dire in resultadosComprados)
    {


    lvItem = new ListViewItem(dire.NombreCalle);
    lvItem.SubItems.Add(dire.Altura.ToString().Trim());
    lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
    lvItem.SubItems.Add(dire.Comuna);
    lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
    lvItem.SubItems.Add(dire.NombreVendedor);
    lvItem.SubItems.Add(dire.Estado.ToString());
    this.lvResultados.Items.Add(lvItem);

    }



    private void Start()
    {

    if (currentThread == null)
    {

    currentThread = new System.Threading.Thread(DoProcess);

    currentThread.Start();

    }

    }
    private void Stop()
    {

    if (currentThread != null)
    {

    currentThread.Abort();

    currentThread = null;

    pbRutas.Value = 0;

    }

    }
    private void DoProcess()
    {

    for (int i = 0; i <= this.lvResultados.Items.Count; i++)
    {

    System.Threading.Thread.Sleep(10);

    decimal percent = (i / this.lvResultados.Items.Count) * 100;

    RefreshProgress(percent);

    }

    currentThread = null;

    }






    Como lo implemento en ese foreach el start con el progress bar??

    esta bien lo que reemplaze?



    tengo problema aka

    public void RefreshProgress(decimal value)

    {

    if (this == null) return;

    Invoke(new Action(() => pbRutas.Value = (int)value)); //linea problema

    }


    me dice que falta un ) xD no cacho como arreglarlo Stick out tongue


    desde ya muchas gracias ^^!
    martes, 2 de septiembre de 2008 13:59
  • :-)

    Hola,

     

    Las expresiones lambda son de C# 3.0, con lo cual aparecen con VS2008.

    Es posible que estés usando una versión anterior?

     

    Si es así deberemos crear explícitamente el delegado:

    Aplica estos cambios:

     

    delegate void RefreshProgressDelegate(decimal percent);
     
    public void RefreshProgress(decimal value)
    {
        if (this == null) return;
        progressBar.Value = (int)value;
    }
     
    private void DoProcess()
    {
        for (int i = 0; i <= valueUpDown.Value; i++)
        {
            System.Threading.Thread.Sleep(10);
            var percent = (i / valueUpDown.Value) * 100;
            this.Invoke(new RefreshProgressDelegate(RefreshProgress),percent);
        }
        currentThread = null;
    }

     

    Saludos,

    martes, 2 de septiembre de 2008 15:08
    Moderador
  • uso visual studio 2005 Stick out tongue

    mmm

    en el foreach como pongo el start()
    para mi progressbar?
    ya que ahi incremento mi progressbar

     foreach (Dominio.CCTARE dire in resultadosComprados)
                        {


                            lvItem = new ListViewItem(dire.NombreCalle);
                            lvItem.SubItems.Add(dire.Altura.ToString().Trim());
                            lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
                            lvItem.SubItems.Add(dire.Comuna);
                            lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
                            lvItem.SubItems.Add(dire.NombreVendedor);
                            lvItem.SubItems.Add(dire.Estado.ToString());
                            this.lvResultados.Items.Add(lvItem);
                           
                            pbRutas.PerformStep(); // AQUI
                        }

    y el maximo lo sako de aka

               ArrayList resultadosComprados = registro.BuscarRutasCompradas(codigoPromotorBuscar, this.txtCalleRuta.Text.Trim(), altura.Trim(), this.cbComuna.Text.Trim());
                        ArrayList resultadosVendedores = registro.buscarNombrePromotor();
                        ArrayList resultadosTida = registro.TipoDeDato();
                        pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;

    Desde ya muchas gracias Big Smile
    martes, 2 de septiembre de 2008 15:39
  • Pues depende de lo quieras hacer...

     

    En mi caso al pulsar el botón llamo al método Start, que crea un nuevo thread para llamar asíncronamente al método DoProcess.

     

    Es decir, lo que quieras hacer repetidamente lo colocas dentro del DoProcess (en tu caso debe ser el foreach), y dentro del bucle haces una llamada al método RefreshProgress con el valor del % que has calculado...

     

    Espero haberte aclarado,

     

     

    martes, 2 de septiembre de 2008 16:08
    Moderador
  • mm no he entendido xD pero no importa gracias de todas formas ^^

    si puedes hacerme un ejemplo seria genial sino muchas gracias D:!

    mi foreach lo puse un pokito mas arriba

    desde ya muhcas gracias ^^!
    martes, 2 de septiembre de 2008 16:37
  • observación a lo que he leido... se recomienda mas utilizar el backgroundworker cuando implementas subprocesos en formularios

     

    un pekeño ejemplo a ver si te ayuda.

     

    Code Snippet

    //Código donde defines variables publicas.

    BackgroundWorker bgw = new BackgroundWorker();

     

    //crea delegado para actualizar barra de progreso al exportar informaci¢n a excel

    delegate void ActBarraDeProgreso(String Estado, int TRegistros);

    ActBarraDeProgreso pbDelegate;

     

     

    Code Snippet

    private void Form_Load(object sender, EventArgs e)

    {

    //estabece delegado para barra de progreso

    pbDelegate = new ActBarraDeProgreso(BarraDeProgreso);

     

    // configura BackgroundWorker

    bgw.WorkerSupportsCancellation = true;

    bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);

    bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);

    }

     

     

    Code Snippet

    private void botonExcel_Click(object sender, EventArgs e)

    {

    bgw.RunWorkerAsync();

    }

     

     

     

    Code Snippet

    private void EnviarAExcel()

    {

    //Metodo para exportar a excel

    //cuando se exporta el detalle se resumio el código y solo se deja para actualizar barra de progreso

    // aki tendras que reemplazar por tu código, el if para verificar si se ha cancelado la busqueda o lo que sea se tiene que mantener.

    for (Row = 0; Row < view.Count; Row++)

    {

    if (bgw.CancellationPending)

    {

    // se ha cancelado la exportación a excel

    return;

    }

     

    // Actualiza barra de progreso

    Invoke(pbDelegate, new Object[] { "Actualizar", 0 });

    }

    }

     

     

     

     

     

     

     

    Code Snippet

    private void bgw_DoWork(object sender, DoWorkEventArgs e)

    {

    EnviarAExcel()

    if (bgw.CancellationPending)

    e.Cancel = true;

    }

     

     

     

    Code Snippet

    private void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

    {

    if (e.Error != null)

    MessageBox.Show(this, "Error en proceso", Text, MessageBoxButtons.OK, MessageBoxIcon.Error);

    else if (e.Cancelled)

    MessageBox.Show(this, "Proceso cancelado", Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

    else

    MessageBox.Show(this, "Proceso terminado", Text, MessageBoxButtons.OK, MessageBoxIcon.Information);

    Invoke(pbDelegate, new object[] { "Terminar", 0 });

    }

     

     

     

    Code Snippet

    private void btnCancelarProceso_Click(object sender, EventArgs e)

    {

    bgw.CancelAsync();

    }

     

     

     

    Code Snippet

    private void BarraDeProgreso(String Estado, int TRegistros)

    {

    if (Estado == "Visible")

    {

    ProgressBar.Minimum = 1; ProgressBar.Maximum = TRegistros;

    ProgressBar.Value = 1; ProgressBar.Step = 1;

    ProgressBar.Visible = true; btnCancelarProceso.Visible = true;

    botonExcel.Enabled = false;

    }

    else if (Estado == "Actualizar")

    {

    ProgressBar.PerformStep();

    }

    else if (Estado == "Terminar")

    {

    ProgressBar.Visible = false;

    btnCancelarProceso.Visible = false;

    botonExcel.Enabled = true;

    }

    }

     

     

     

     

     

     

    miércoles, 3 de septiembre de 2008 1:51
    Moderador
  • Code Snippet

    no me funka =(!


    este es mi codigo


    ArrayList resultadosComprados = registro.BuscarRutasCompradas(codigoPromotorBuscar, this.txtCalleRuta.Text.Trim(), altura.Trim(), this.cbComuna.Text.Trim());
    ArrayList resultadosVendedores = registro.buscarNombrePromotor();
    ArrayList resultadosTida = registro.TipoDeDato();
    lvResultados.Items.Clear();
    pbRutas.Maximum = resultadosComprados.Count + resultadosVendedores.Count + resultadosTida.Count;
    //pbRutas.Location = new System.Drawing.Point(8, 312);
    pbRutas.Step = 1;
    //pbRutas.Size = new System.Drawing.Size(520, 40);

    foreach (Dominio.CCTARE dire in resultadosComprados)
    {


    lvItem = new ListViewItem(dire.NombreCalle);
    lvItem.SubItems.Add(dire.Altura.ToString().Trim());
    lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
    lvItem.SubItems.Add(dire.Comuna);
    lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
    lvItem.SubItems.Add(dire.NombreVendedor);
    lvItem.SubItems.Add(dire.Estado.ToString());
    this.lvResultados.Items.Add(lvItem);


    pbRutas.PerformStep();
    }



    me puedes hechar una manito ahi??


    q me faltaria aplicar en ese boton? siendo q ya tengo tu codigo ppuesto ,P!












    miércoles, 3 de septiembre de 2008 14:02
  • :-)

    Hola de nuevo,

    Vayamos por partes, que no se si te estoy entendiendo bien.

     

    1 - Tu tienes un ArrayList llamado 'resultadosComprados' y quieres agregar los elementos a un ListView y mostrar el progreso en un ProgressBar, ok?

     

    2 - Pero como no quieres bloquear el interface, te gustaría hacerlo en modo asíncrono (con un thread, backgroundworker, o lo que sea).

     

    3 - Y supongo que todo este proceso de llenar el ArrayList y volcar el resultado al ListView lo realizarás en algún momento en respuesta a algún evento... Por ejemplo al pulsar un botón, al cargar una ventana, etc.)

     

    Dime si es eso, y entonces intentaré crear un ejemplo.

    Saludos,

    miércoles, 3 de septiembre de 2008 14:53
    Moderador
  • Hola! Big SmileBig SmileBig SmileBig Smile:!!


    1-. asi es, ese Arraylist lo obtengo de una consulta sql y luego lo recorro uno por uno y lo pongo en el listview Big Smile
    2- asi es, pero si es posible que mientras este recorriendo el arreglo se vallan agregando los elementos los valla mostrando altiro se puede?

    3-. tengo un boton buscar que tiene

      ArrayList resultadosComprados = registro.BuscarRutasCompradas(codigoPromotorBuscar, this.txtCalleRuta.Text.Trim(), altura.Trim(), this.cbComuna.Text.Trim());
                        lvResultados.Items.Clear();
                        pbRutas.Maximum = resultadosComprados.Count;
                        pbRutas.Step = 1;
                        foreach (Dominio.CCTARE dire in resultadosComprados)
                        {


                            lvItem = new ListViewItem(dire.NombreCalle);
                            lvItem.SubItems.Add(dire.Altura.ToString().Trim());
                            lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
                            lvItem.SubItems.Add(dire.Comuna);
                            lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
                            lvItem.SubItems.Add(dire.NombreVendedor);
                            lvItem.SubItems.Add(dire.Estado.ToString());
                            this.lvResultados.Items.Add(lvItem);
     
                           
                            pbRutas.PerformStep();
                        }


    son aproximadamente 5.000 registros entonces tarda mucho Stick out tongue!

    Big SmileBig Smile!
    miércoles, 3 de septiembre de 2008 15:48
  • :-)

    Hola de nuevo,

     

    Entonces si no me equivoco, lo que tu deseas es que se vaya actualizando el progressbar a medida que se vaya rellenando el ListView para que el usuario no tenga la impresión de que se demora demasiado, no?

     

    Pero realmente no deseas ejecutar ninguna tarea de forma asíncrona, ni quieres que el usuario se vaya a otro sitio de la aplicación mientras se realiza la carga, no?

     

    Pues entonces no te compliques la vida con threads, que es matar moscas a cañonazos.

    Cada vez que cargues 100 registros en el ListView llamas a DoEvents() y punto:

     

    private void AddArrayListToListView(ArrayList resultados, ListView List)
    {
        int i = 0;
        foreach (Dominio.CCTARE dire in resultados)
        {
            ListViewItem lvItem = new ListViewItem(dire.NombreCalle);
            lvItem.SubItems.Add(dire.Altura.ToString().Trim());
            lvItem.SubItems.Add(dire.UbicacionesCompra.ToString());
            lvItem.SubItems.Add(dire.Comuna);
            lvItem.SubItems.Add(dire.FechaContrato.ToShortDateString());
            lvItem.SubItems.Add(dire.NombreVendedor);
            lvItem.SubItems.Add(dire.Estado.ToString());
            List.Items.Add(lvItem);
            pbRutas.PerformStep();
            i++;
            if (i % 100 == 0) Application.DoEvents();
        }
    }

     

    Saludos,

     

     

    jueves, 4 de septiembre de 2008 13:23
    Moderador
  • =(! donde son 5.000 registros  minimizo la ventana y se welve loko =(! como puedo hacer para q no pierda la interfaz de manera facil?? Big Smile?


    gracias por tu respuesta
    jueves, 4 de septiembre de 2008 13:35
  • se puede en el ejemplo del foreach aplicar un BackGroundWorker con progress bar o nu? =(!
    viernes, 5 de septiembre de 2008 16:02