Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Σύνδεση progressbar με button σε vs 2005 C#

Îåêßíçóå áðü ôï ìÝëïò DUDE!!. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 15-09-2009, 10:41. Υπάρχουν 16 απαντήσεις.
Σελίδα 1 από 2 (17 εγγραφές)   1 2 >
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  14-09-2009, 03:03 53702

    Σύνδεση progressbar με button σε vs 2005 C#

    Θέλω να συνδέσω ένα progressbar με ένα button. Δλδ με το που γίνετε κλικ στο Button αυτό εμφανίζει μία εικόνα. θέλω με το που γίνετε κλικ στο button το progressbar να αρχίσει να φορτώνει και να γεμίσει με το που ολοκληρώσει το button την φόρτωση της εικόνας. Υπάρχει καμιά ιδέα για αυτό????
  •  14-09-2009, 08:23 53703 σε απάντηση της 53702

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Θα πρέπει να είσαι πιο συγκεκριμένος στις ερωτήσεις σου. Για τι είδους εφαρμογή μιλάς; WinForms? Web?


    Vir prudens non contra ventum mingit
  •  14-09-2009, 10:51 53705 σε απάντηση της 53702

    Απ: Σύνδεση progressbar με button σε vs 2005 C#


    θα προσπαθησω σε πολυ "γενικες" γραμμές να σου δωσω καποια ιδέα,

    λοιπον αν καταλαβαινω απο αυτα που προσπαθείς να περιγράψεις, λες "να εμφανίζει μια εικόνα" αλλα μέχρι να κατέβει να έχεις progress bar. για Web μου ακουγεται...δεν ξερω...
    κοιτα γενικα μια καλη ιδέα ειναι, αν προκειτε για μεταφορα ενώς αρχείου να μπορεις να διαβάσεις το συνολικο μέγεθος του αρχειου αυτου πρωτα να το κανεις ποσοστο %100 και αυτο να ειναι το 100% της μπάρας προοδου σου.

    μετα καθώς το μεταφέρεις "εμφανίζεις" λογικα το γράφεις κάπου αλλου το αρχειο - εικονα... κανε μια loop καθε 1sec να διαβαζει το μεγεθος του αρχειου σου καθως γράφεται στη νεα θεση και αυτο καντο μετατροπή σε ποσοστο % και βάλτο ως currentprogress στην μπαρα.

    παραδειγμα. το αρχειο ειναι 100ΚΒ αρα το 100ΚΒ να ειναι το 100% στο Maximum Progress Value

    ξεκινάς την μεταφορα - αντιγραφη και καθε ενα δευτ κοιτας το μεγεθος του αρχειου που ερχεται, 

    ας πουμε οτι μετα απο 5δευτερολεπτα εχουν αντιγραφει 39kb άρα θα μετατρεψεις το 39 σε % και θα το εμφανιζεις στην μπαρα.

    εγω παντος για αντιγραφες αρχειων με "ετοιμη μπαρα" δουλευω πάντα την My.Computer.Network.DownloadFile και Upload, απο και προς server me ftp. etc. (in WinForms)

    τωρα αν ειναι web και θες να βλεπεις ποσο εχει "κατεβει" η εικονα ίσως να μετρας τα bytes που μεταδιδοντε αλλα δεν μπορω να σου πω πως ακριβως δεν ασχολουμε με web.


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  14-09-2009, 12:14 53708 σε απάντηση της 53705

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Πιο απλά δεν γίνετε....????Δλδ εγώ είχα σκεφτεί αν μπορεί να συνδεθεί με την λειτουργία του button. Να ξεκινήσει να γεμιζει το progressbar όταν ξεκινήσει το event button1_click και να γεμισει 100% όταν ολοκληρωθεί το event. Μήπως γίνετε έτσι???

    αα για win appl μιλάμε αυτήν την στιγμή.

  •  14-09-2009, 14:22 53714 σε απάντηση της 53708

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Καταρχήν, δεν γίνεται έτσι όπως το περιγράφει ο Johnny. Το λιγότερο, το My.Network κλπ είναι μία helper κλάση της VB.NET και μόνο. Δεύτερον, ο κώδικας σου θα αναγκαστεί να μπλοκάρει για όση ώρα χρειαστεί να κατεβάσεις το αρχείο. Αποτέλεσμα? Δεν θα γίνεται redraw το ProgressBar.

    Θα πρέπει να ξεκαθαρίσεις τί είναι αυτό που ζητάς να γίνει. Θέλεις να έχεις ένα progressbar το οποίο στην αρχή θα είναι στη θέση 0. Όταν πατάς κάποιο κουμπί στη φόρμα σου, θα εκτελέσεις κώδικα ο οποίος θα κατεβάσει ένα μεγάλο αρχείο από κάπου. Σε περιοδικά διαστήματα θέλεις να γίνεται update το progress bar για να δείξει την πρόοδο. Όταν τελειώσει το κατέβασμα, είτε θα αφήσεις το progress bar ως έχει είτε θα το μηδενίσεις.

    Ο παρακάτω κώδικας θα κατεβάσει κάποιο αρχείο, σελίδα ή εικόνα και περιοδικά θα γράψει στην κονσόλα την πρόοδο του κατεβάσματος. Ό κώδικας που γράφει την πρόοδο εκτελείται σε ξεχωριστό thread και έτσι δεν μπλοκάρει ποτέ η εκτέλεση του. Δυστυχώς, το ProgressBar θέλει λίγη δουλίτσα ακόμη καθώς δεν μπορείς να κάνεις update σε ένα UI control από το ξεχωριστό thread. Μόλις προλάβω θα γράψω και τον κώδικα που χρειάζεται για να γίνει αυτό

    WebClient client=new WebClient();
    client.DownloadProgressChanged+=(sender,args) => {
          Console.WriteLine("{0} of {1} received, {2}", args.BytesReceived ,args.TotalBytesToReceive,args.ProgressPercentage ); 
       };
    
    client.DownloadFileAsync(new Uri(@"http://msdn.microsoft.com/en-us/default.aspx"),@"e:\test.tmp");	
    Η κλάση WebClient είναι αυτή που χρησιμοποιεί και το My.Network από πίσω για να υλοποιήσει την DownloadFile. Τα DownloadProgressChanged είναι ένα event που σηκώνεται περιοδικά όσο κατεβαίνουν 
    τα δεδομένα και μεταξύ άλλων επιστρέφει και το ποσοστό ολοκλήρωσης.
     

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-09-2009, 18:05 53720 σε απάντηση της 53714

    Απ: Σύνδεση progressbar με button σε vs 2005 C#





    1) αυτο που ειπα το εχω κανει γινεται αλλα δεν τρελαίνομαι κι ολας ως ιδεα.(λεω για το tranfsered byteς)

    2) η κλαση my.network ειναι οτι ποιο "απλο" μπορω να σκεφτω (και ΔΕΝ κολαει το progress never απλα ειναι σαν dialogbox, wait to finish) τα εχει ολα ετοιμα και εσυ απλα συμπληρωνεις τα απαραιτητα "στοιχεια". τι ενοεις ποιο ευκολος τροπος δεν υπαρχει? τα progress bar δεν γινονται ως δια μαγειας θελει λιγο να αφιερώσεις χρόνο.

    3)και σημαντικότερο παντα οταν κατεβαζεις μεγαλο ογκο θα σου "παγωνει" η εφαρμωγη-UI και δεν θα βλεπεις αλλαγές στο Interface, ο ποιο τσαπατσουλικος τροπος ειναι να κανεις συχνα me.validate αλλα ειναι πολυ τσαπατσουλικη λυση που θα απασχολει περισσοτερο την εφαρμογή σου και μπορεί να μην δουλεύει πάντα.

    Γενικά η ποιο καλη-σωστη λυση ειναι νεο thread οπως ειπε και ο Παναγιωτης (κυρίως αμα θες να κατεβάζεις κατι ΠΟΛΥ μεγάλο και ταυτόχρονα θες να κανεις και άλλα πραγματα στην εφαρμωγή σου απο το να περημένεις), Αντιθέτως αν δεν θες να κάνεις κατι αλλο την ωρα που κατεβαίνει η εικονα τοτε κανε χρήση η της  Network(). την webclient δεν την γνωριζω να σου πω την αληθεια αλλα θελω να δω τι κανει αυτο το client.DownloadFileAsync....
    δεν εκατσα καν να μπω σε λεπτομερειες καθως λιγο λιγο μας δινεις τις πληροφοριες και ακομα δεν εχω καταλαβει 100% τι θες να κανεις.Tongue Tied
    για thread δες kai τον background worker ειναι ο ποιο γρηγορος και ευκολος τροπος να κανεις νεο thread να περνεις προοδο απο αυτο και να το περνας σε μια μπαρα.

    απο κει και περα πρεπει να ψαχτεις και λιγο εσυ, παντος στο MSDN θα βρεις πολυ ευκολα παραδειγματα για τον BackgroundWorker or my.Network.

    goodluck dude

    p.s α κατι ακομα, αν πας σε thread λυση, οντος ΔΕΝ μπορεις να κανεις ετσι απλα Update ενα control μεσα απο ενα άλλο thread, δηλαδη στοn backgroundWorker sto Do_WORK δεν θα μπορουσες να πεις me.progressbar1.value=+1 παραδειγμα θα σκασει, ΑΛΛΑ εχω βρει μια π**σ***α (συγνώμη για την λεξη) πως στο event OnProgressChanged του BW Μπορεις να το κανεις χωρις προβλημα, αν θυμαμαι καλα....


    p.s2 τελος βρηκα googlarontas και αυτο που κανει αυτο που θελει να σου γραψει αργοτερα και ο Παναγιωτης. Update controls from an other thread.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue);
    
    public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)
    {
      if (control.InvokeRequired)
      {
        control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue });
      }
      else
      {
        control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });
      }
    }

    κάλεσε την καπως ετσι:

    1
    2
    3
     
    // thread-safe equivalent of
    // myLabel.Text = status;
    SetControlPropertyThreadSafe(myLabel, "Text", status);

    και αν γραφεις σε 3.5 μπορεις να ξαναγραψει το παραπανω ως extension method του Control class και να το καλεις ακομα ποιο ευκολα:

    1
     
    myLabel.SetPropertyThreadSafe("Text", status);


    This Business Is Binary. You are a 1 or a 0. Alive or Dead.-
  •  14-09-2009, 19:16 53724 σε απάντηση της 53720

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Πρίν από αρκετόόόό καιρό είχα γράψει ένα σχετικό άρθρο εδώ http://www.dotnetzone.gr/cs/blogs/mkelaiditis/pages/10156.aspx 

    Είναι πριν το Visual Studio 2005 όπερ σημαίνει ότι δεν έχει BackgroundWorker. Ωστόσο, ο BakckgroundWorker δεν είναι τίποτε άλλο παρά κώδικας σαν κι αυτόν που αναφέρεται στο άρθρο σε μορφή component. Αν καταλάβεις λοιπόν το άρθρο, έχεις καταλάβει και τις ασύγχρονες διαδικασίες και θα σου είναι πολύ εύκολο να χρησιμοποιήσεις τον BackgroundWorker.


    Vir prudens non contra ventum mingit
  •  14-09-2009, 20:31 53725 σε απάντηση της 53724

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Ευχαριστώ πολύ για την ανταπόκριση. Θα το παλέψω. πιστεύω κάτι θα βγειSmile

    thanks
  •  14-09-2009, 21:17 53726 σε απάντηση της 53725

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Βρήκα το χρόνο και έφτιαξα και το ProgressBar. Έφτιαξα μία φόρμα με δύο textbox, το txtUrl Και το txtFile . Πατώντας το κουμπί btnGet τραβάω ασύγχρονα τα data με την DownloadDataAsync. Για να δείξω τις αλλαγές στο progress bar πιάνω το event DownloadProgressChanged. Επειδή το event όμως εκτελείται στο thread που έχει δημιουργήσει η DownloadDataAsync, δεν μπορώ να αλλάξ απευθείας το progressBar1.Value. Αντί γι αυτό, έχω φτιάξει μία μέθοδο η οποία χρησιμοποιεί αυτά που λέει ο Μάνος για να καλέσει την .Value στο σωστό thread :

    public partial class Form1 : Form
        {
            WebClient client = new WebClient();
    
            private delegate void SetValueDelegate(int pct);
            private void SetValue(int pct)
    		{
    			// InvokeRequired required compares the thread ID of the
    			// calling thread to the thread ID of the creating thread.
    			// If these threads are different, it returns true.
    			if (this.progressBar1.InvokeRequired)
    			{	
    				Delegate d = new SetValueDelegate(SetValue);
    				this.Invoke(d, new object[] { pct });
    			}
    			else
    			{
    			    this.progressBar1.Value = pct;
    			}
    		}
    
    
            private string targetFile;
    
            public Form1()
            {
                InitializeComponent();
                // Handle the DownloadProgressChanged and update the progress bar
                client.DownloadProgressChanged+= (c, args) => SetValue(args.ProgressPercentage);
    	// When finished, write all the data to a file
    client.DownloadDataCompleted += (c, args) => File.WriteAllBytes(targetFile, args.Result); client.Credentials = CredentialCache.DefaultCredentials; } private void btnGet_Click(object sender, EventArgs e) { progressBar1.Minimum = 0; progressBar1.Maximum = 100; progressBar1.Value = 0; targetFile = txtFile.Text; client.DownloadDataAsync(new Uri(txtUrl.Text)); } }

     

    Παραπάνω βαρέθηκα ελαφρώς να φτιάξω νέα μέθοδο για το DownloadProgressChanged και το DownloadDataCompleted event και χρησιμοποίησα lamda functions που περιέχουν την ίδια γραμμή που θα έγραφα και σε ένα event handler.

    Παραπάνω χρησιμοποίησα την DownloadData γιατί υποψιάζομαι ότι ο DUDE θέλει να χρησιμοποιήσει το Google Chart API για να τραβήξει εικόνες chart. Η DownloadFile σώζει τα αποτελέσματα στο σκληρό ενώ η DownloadData σου τα αφήνει στη μνήμη οπότε μπορείς να τα χρησιμοποιήσεις ή να τα δείξεις απευθείας, χωρίς να τα σώσεις πρώτα στο σκληρό.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-09-2009, 21:27 53727 σε απάντηση της 53726

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Μόλις συνειδητοποίησα τί έγραψα. Αφού μιλάω για image και μνήμη, γιατί γράφω στο σκληρό? Αντί γι αυτό πρόσθεσα ένα PictureBox στη φόρμα και στην DownloadComplete δείχνω την εικόνα.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            WebClient client = new WebClient();
    
            private delegate void SetValueDelegate(int pct);
            private void SetValue(int pct)
    		{
    			// InvokeRequired required compares the thread ID of the
    			// calling thread to the thread ID of the creating thread.
    			// If these threads are different, it returns true.
    			if (this.progressBar1.InvokeRequired)
    			{	
    				Delegate d = new SetValueDelegate(SetValue);
    				this.Invoke(d, new object[] { pct });
    			}
    			else
    			{
    			    this.progressBar1.Value = pct;
    			}
    		}
    
            private delegate void SetImageDelegate(byte[] imageData);
            private void SetImage(byte[] imageData)
            {
                pictureBox1.Image = Image.FromStream(new MemoryStream(imageData));
            }
    
    
            private string targetFile;
    
            public Form1()
            {
                InitializeComponent();
                client.DownloadProgressChanged+= (c, args) => SetValue(args.ProgressPercentage);
                client.DownloadDataCompleted += (c, args) => SetImage(args.Result);
                client.Credentials = CredentialCache.DefaultCredentials;
    
            }
    
    
            private void btnGet_Click(object sender, EventArgs e)
             {
                progressBar1.Minimum = 0;
                progressBar1.Maximum = 100;
                progressBar1.Value = 0;
                targetFile = txtFile.Text;
                client.DownloadDataAsync(new Uri(txtUrl.Text));	
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
        }
    }

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-09-2009, 21:41 53728 σε απάντηση της 53727

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Παναγιώτη thanks και ναι πολύ καλά κατάλαβες τι θέλω να κάνωBig Smile

    Νομίζω τον ψιλοκατάλαβα τον κώδικα τι κάνει μόνο που όταν πάω να τον τρέξω πειραματικά και να δώ τι γίνετε μου βγάζει πρόβλημα στο παρακάτω κομμάτι:

    client.DownloadProgressChanged+= (c, args) => SetValue(args.ProgressPercentage);
    client.DownloadDataCompleted += (c, args) => SetImage(args.Result);
    client.Credentials = CredentialCache.DefaultCredentials;


    μου λέει πως είναι invalid σαν expression οι παρενθέσεις και τα , και ότι χρειάζετε ;
    δεν αναγνωρίζει την σύνταξη αυτού του κομματιού του κώδικα δλδ. πρέπει να προσθέσω κάτι ακόμα???


  •  14-09-2009, 22:46 53729 σε απάντηση της 53728

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Μήπως χρησιμοποιείς Visual Studio 2005? Η παραπάνω σύνταξη δουλεύει με το 2008. Με το 2005 θα πρέπει να φτιάξεις ένα event handler για καθένα από τα events. Ο κώδικας θα πρέπει να γίνει:

        public partial class Form1 : Form
        {
            WebClient client = new WebClient();
    
            private delegate void SetValueDelegate(int pct);
            private void SetValue(int pct)
    		{
    			// InvokeRequired required compares the thread ID of the
    			// calling thread to the thread ID of the creating thread.
    			// If these threads are different, it returns true.
    			if (this.progressBar1.InvokeRequired)
    			{	
    				Delegate d = new SetValueDelegate(SetValue);
    				this.Invoke(d, new object[] { pct });
    			}
    			else
    			{
    			    this.progressBar1.Value = pct;
    			}
    		}
    
            private delegate void SetImageDelegate(byte[] imageData);
            private void SetImage(byte[] imageData)
            {
                pictureBox1.Image = Image.FromStream(new MemoryStream(imageData));
            }
    
    
            public Form1()
            {
                InitializeComponent();
                client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
                client.DownloadDataCompleted += new DownloadDataCompletedEventHandler(client_DownloadDataCompleted);
                client.Credentials = CredentialCache.DefaultCredentials;
    
            }
    
            void client_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
            {
                SetImage(e.Result);
            }
    
            void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
            {
                SetValue(e.ProgressPercentage);
            }
    
    
            private void btnGet_Click(object sender, EventArgs e)
             {
                progressBar1.Minimum = 0;
                progressBar1.Maximum = 100;
                progressBar1.Value = 0;
                client.DownloadDataAsync(new Uri(txtUrl.Text));	
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
    
            }
        }

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-09-2009, 22:49 53730 σε απάντηση της 53728

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    μήπως χρειάζετε η προσθήκη του
    using System.Linq;

    στο δικό μου το project το προσθέτω αλλά δεν το αναγνωρίζει
  •  14-09-2009, 23:00 53731 σε απάντηση της 53730

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    ok τώρα δεν μου βγάζει τέτοιο πρόβλημα. αλλά δεν καταλαβαίνω κατι στον κώδικα που για να τρέξει μάλλον πρέπει να το αλλάξω.
    στην γραμμη
    client.DownloadDataAsync(new Uri(txtUrl.Text))

    το αντικείμενο txtUrl.Text πιο είναι? τι πρέπει να βάλω στην παρένθεση???

  •  14-09-2009, 23:04 53732 σε απάντηση της 53731

    Απ: Σύνδεση progressbar με button σε vs 2005 C#

    Στη φόρμα έχω βάλει ένα textbox που λέγεται txtUrl. Αντί γι αυτό θα πρέπει να βάλεις το URL που θέλεις να χρησιμοποιήσεις, π.χ.

    client.DownloadDataAsync(new Uri(@"http://chart.apis.google.com/chart?cht=p3&chd=t:60,40&chs=250x100&chl=Hello|World"))


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Σελίδα 1 από 2 (17 εγγραφές)   1 2 >
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems