none
Controlar ProgressBar mientra se descarga un List<> RRS feed

  • Pregunta

  • Hola a todos, ¿alguien sabe si hay manera de gestionar un control ProgressBar a medida que obtienen los datos ya que es una colección de objetos? (no me refiero a un progressbar indefinido hasta que termine la lectura, sino a uno real).

    Gracias.


    SPKDevelopers

    lunes, 15 de abril de 2013 10:20

Respuestas

  • como en este ejemplo

    void usrCtrlChangePassword_Loaded(object sender, RoutedEventArgs e)  
    {  
    
       grdDetail.Visibility = Visibility.Collapsed;  
       rpbProgress.Visibility = Visibility.Visible;  
    
       this.timer = new System.Windows.Threading.DispatcherTimer();  
       this.timer.Interval = TimeSpan.FromMilliseconds(10.0);  
       this.timer.Tick += new EventHandler(timer_Tick);  
       this.timer.Start();  
    
       ADDCInfo.DomainControllerInfoClient DIC = new ADPwdChange.ADDCInfo.DomainControllerInfoClient();  
                DIC.getDomainControllersCompleted += new EventHandler<ADPwdChange.ADDCInfo.getDomainControllersCompletedEventArgs>(DIC_getDomainControllersCompleted);  
                DIC.getDomainControllersAsync();  
    } 
    
    
     void timer_Tick(object sender, EventArgs e)  
     {  
             rpbProgress.Value += 50;  
     }  
    
     void DIC_getDomainControllersCompleted(object sender, ADPwdChange.ADDCInfo.getDomainControllersCompletedEventArgs e)  
    {  
                List<myDomainController> myDCList = new List<myDomainController>();  
                myDCList = e.Result;  
                rcbDomain.DataContext = myDCList;  
                rcbDomain.ItemsSource = myDCList;  
    
                var query = (from p in myDCList where p.Description == "EMEA" select p).FirstOrDefault();  
    
                rcbDomain.SelectedItem= query;  
    
                this.timer.Stop();  
                rpbProgress.Value = rpbProgress.Maximum;  
                grdDetail.Visibility = Visibility.Visible;  
                rpbProgress.Visibility = Visibility.Collapsed;  
     } 
    


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

    lunes, 15 de abril de 2013 14:28
    Moderador
  • Tanto en el ejemplo que me has puesto como "Pues supongo que deberas llamar asincronamente al servicio WCF, ir aumentando con un timer por ejemplo el progressbar y cuando la llamada a wcf te devuelva control, establecer el value del progressbar a 100%..." entiendo que no es un ProgressBar real, es decir, es igual que hacer uno infinito hasta que termine de obtener los datos.

    Lo que intento es que el ProgressBar tenga un tamaño igual a la respuesta de la consulta, es decir, si tengo que obtener 300 elementos, cada vez que obtengo uno, aumenta el progreso un 0.3.


    SPKDevelopers

    lunes, 15 de abril de 2013 14:34

Todas las respuestas

  • En que entorno vas a desarrollarlo?? web o escritorioi?

    De todas formas mueve el hilo a otro foro ya que este es de WCF... un saludo


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


    lunes, 15 de abril de 2013 12:44
    Moderador
  • Trabajo en escritorio, mediante un ServiceHost.

    Movería el hilo a C#, pero no tengo ni idea de como hacerlo.

    Saludos.


    SPKDevelopers

    lunes, 15 de abril de 2013 13:25
  • Use the BackgroundWorker class to fill your DataGrid.
         Form progressForm;
    
         public void func() {
            BackgroundWorker bw = new BackgroundWorker ();
            bw.DoWork += new DoWorkEventHandler (bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler (bw_RunWorkerCompleted);
    
            progressForm = new Form ();
    
            ProgressBar pb = new ProgressBar ();
    
            pb.MarqueeAnimationSpeed = 30;
            pb.Style = ProgressBarStyle.Marquee;
            pb.Dock = DockStyle.Fill;
    
            progressForm.ClientSize = new Size (200, 50);
            progressForm.FormBorderStyle = FormBorderStyle.FixedDialog;
            progressForm.StartPosition = FormStartPosition.CenterScreen;
            progressForm.Controls.Add (pb);
            progressForm.ControlBox = false;
            progressForm.TopMost = true;
    
            progressForm.Show ();
    
            string queryString = "SELECT ...."; // fill query string here
            var params = new KeyValuePair<GridControl, string>(sorgu, queryString);
            bw.RunWorkerAsync (params);
        }
    
        void bw_DoWork (object sender, DoWorkEventArgs e) {
            KeyValuePair<GridControl, string> params = e.Argument as KeyValuePair<GridControl, string>;
            ConnectionClass cc = new Connection Class();
            cc.fillGrid(params.Value, params.Key);
        }
    
        void bw_RunWorkerCompleted (object sender, RunWorkerCompletedEventArgs e) {
            progressForm.Close (); //
        }

    Te pongo un ejemplito, adaptalo a tus necesidades.. saludos

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

    lunes, 15 de abril de 2013 13:43
    Moderador
  • Aunque sólo los he mirado por encima, comentarte que sería para aplicarlo con WCF y en el cliente, es decir, ahora mismo tengo lo siguiente para consultar:

    En el lado Servidor:

    [OperationContract]
    List<Producto> obtenerTodosProductos();
    
    
    public List<Producto> obtenerTodosProductos()
            {
                using (var db = new ModeloDBContainer(new EntityConnection(conexion)))
                {
                    db.ContextOptions.LazyLoadingEnabled = false;
    
                    return db.Productos
                        .Include("Familia")
                        .Include("ProductosAsociados")
                        .Include("ProductosAsociados.Producto")
                        .Where(p => p.Activo == true && p.Venta == true).ToList();
                }
            }

    Luego en el cliente (en éste caso es Windows Phone aunque creo que eso no tiene mucha importancia):

    ServicioDatosClient servicio = new ServicioDatosClient();
    servicio.obtenerTodosProductosCompleted +=new EventHandler<obtenerTodosProductosCompletedEventArgs>(servicio_obtenerTodosProductosCompleted);
    servicio.obtenerTodosProductosAsync();
    
    private void servicio_obtenerTodosProductosCompleted(object sender, obtenerTodosProductosCompletedEventArgs e)
            {
                GestionDatos.Datos.ListadoProductos.Source = e.Result;
            }

    Uso el evento CompletedEventArgs para obtener el resultado final, pero no se como puedo implementar un ProgressBar en el cliente que se vaya rellenando a medida que obtiene los datos (y no uno indefinido).

    Saludos.


    SPKDevelopers

    lunes, 15 de abril de 2013 14:06
  • Pues supongo que deberas llamar asincronamente al servicio WCF, ir aumentando con un timer por ejemplo el progressbar y cuando la llamada a wcf te devuelva control, establecer el value del progressbar a 100%...


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

    lunes, 15 de abril de 2013 14:18
    Moderador
  • como en este ejemplo

    void usrCtrlChangePassword_Loaded(object sender, RoutedEventArgs e)  
    {  
    
       grdDetail.Visibility = Visibility.Collapsed;  
       rpbProgress.Visibility = Visibility.Visible;  
    
       this.timer = new System.Windows.Threading.DispatcherTimer();  
       this.timer.Interval = TimeSpan.FromMilliseconds(10.0);  
       this.timer.Tick += new EventHandler(timer_Tick);  
       this.timer.Start();  
    
       ADDCInfo.DomainControllerInfoClient DIC = new ADPwdChange.ADDCInfo.DomainControllerInfoClient();  
                DIC.getDomainControllersCompleted += new EventHandler<ADPwdChange.ADDCInfo.getDomainControllersCompletedEventArgs>(DIC_getDomainControllersCompleted);  
                DIC.getDomainControllersAsync();  
    } 
    
    
     void timer_Tick(object sender, EventArgs e)  
     {  
             rpbProgress.Value += 50;  
     }  
    
     void DIC_getDomainControllersCompleted(object sender, ADPwdChange.ADDCInfo.getDomainControllersCompletedEventArgs e)  
    {  
                List<myDomainController> myDCList = new List<myDomainController>();  
                myDCList = e.Result;  
                rcbDomain.DataContext = myDCList;  
                rcbDomain.ItemsSource = myDCList;  
    
                var query = (from p in myDCList where p.Description == "EMEA" select p).FirstOrDefault();  
    
                rcbDomain.SelectedItem= query;  
    
                this.timer.Stop();  
                rpbProgress.Value = rpbProgress.Maximum;  
                grdDetail.Visibility = Visibility.Visible;  
                rpbProgress.Visibility = Visibility.Collapsed;  
     } 
    


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

    lunes, 15 de abril de 2013 14:28
    Moderador
  • Tanto en el ejemplo que me has puesto como "Pues supongo que deberas llamar asincronamente al servicio WCF, ir aumentando con un timer por ejemplo el progressbar y cuando la llamada a wcf te devuelva control, establecer el value del progressbar a 100%..." entiendo que no es un ProgressBar real, es decir, es igual que hacer uno infinito hasta que termine de obtener los datos.

    Lo que intento es que el ProgressBar tenga un tamaño igual a la respuesta de la consulta, es decir, si tengo que obtener 300 elementos, cada vez que obtengo uno, aumenta el progreso un 0.3.


    SPKDevelopers

    lunes, 15 de abril de 2013 14:34
  • Ahora lo entiendo...

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

    lunes, 15 de abril de 2013 14:37
    Moderador
  • Me parece que tvas a tener que hacer tu servicio wcf de tipo dúplex  para empezar


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

    lunes, 15 de abril de 2013 15:13
    Moderador