Forum: PC-Programmierung C# Hilfestellung


von user (Gast)


Lesenswert?

Hallo, folgende Funktion ist für die Visualisierung einer ProgressBar 
zuständig. Nun ist es so das ich nicht eine Progressbar in meiner 
Anwendung habe sondern zwei. Diese sind aber vom Namen unterschiedlich. 
Wie müsste ich die Funktion modifizieren, damit ich nur eine Funktion 
vom Namen "ProgressBar" habe für zwei progressBar Elemente?
1
        private void ProgressBar(int nProgress)
2
        {
3
            FormFTSLichtmodulTool.ProgressBarChangedEventHandler handlerProgressBar;
4
5
            if (this.progressBar_Upload.InvokeRequired)
6
            {
7
                handlerProgressBar = new FormFTSLichtmodulTool.ProgressBarChangedEventHandler(this.ProgressBar);
8
                object[] args = { nProgress };
9
                this.progressBar_Upload.BeginInvoke(handlerProgressBar, args);
10
            }
11
            else
12
            {
13
                this.progressBar_Upload.Value = nProgress;
14
                this.progressBar_Upload.Refresh();
15
            }
16
        }

von Peter II (Gast)


Lesenswert?

user schrieb:
> Wie müsste ich die Funktion modifizieren, damit ich nur eine Funktion
> vom Namen "ProgressBar" habe für zwei progressBar Elemente?

vermutlich geht das gar nicht.

Das ganze ist keine Funktion sondern eine Methode einer Klasse 
(vermutlich von ProgressBar?).

Diese kann damit auch nur auf das eine Objekt zugreifen.

von Peter II (Gast)


Lesenswert?

oh sorry, hatte etwas übersehen:


teste mal mit
1
this.progressBar_Upload.Value = nProgress;
2
this.progressBar_Upload.Refresh();

eigentlich nur die beiden Zeilen kopieren und für die andere Progressbar 
einfügen.

von Tischtrollbürste Fluppi (Gast)


Lesenswert?

user schrieb:
> Wie müsste ich die Funktion modifizieren, damit ich nur eine Funktion
> vom Namen "ProgressBar" habe für zwei progressBar Elemente?

ProgressBar ist ein ziemlich schlechter Name für eine Funktion/Methode. 
Erstens heisst die Klasse "ProgressBar" schon so, zweitens sollte der 
Name ausdrücken, was die Methode macht (sie sollte also, wenn 
sinnvoll, ein Verb enthalten). Besser wäre z.B. "UpdateProgressBar" oder 
in deinem Fall evtl. (s.u.) "UpdateProgressBars".

Zu deiner Frage: Es wird nicht deutlich, ob beide Progress-Bars immer 
das Gleiche anzeigen sollen, nur dass du zwei davon hast.
Falls es (auch) darum geht, ob

  if (this.progressBar_Upload.InvokeRequired)

Schwierigkeiten machen könnte (weil du zwei Progress-Bars hast): Das 
spielt üblicherweise keine Rolle. D.h., ob du für die 
InvokeRequired-Abfrage die erste oder die zweite P.-Bar, irgendein 
anderes Control in der Form oder die Form-Instanz selbst verwendest, 
kommt hier aufs Gleiche raus, da das alles im gleichen (GUI-)Thread 
läuft.

von nicht"Gast" (Gast)


Lesenswert?

user schrieb:
> private void ProgressBar(int nProgress)
>         {
>             FormFTSLichtmodulTool.ProgressBarChangedEventHandler
> handlerProgressBar;
>
>             if (this.progressBar_Upload.InvokeRequired)
>             {
>                 handlerProgressBar = new
> FormFTSLichtmodulTool.ProgressBarChangedEventHandler(this.ProgressBar);
>                 object[] args = { nProgress };
>                 this.progressBar_Upload.BeginInvoke(handlerProgressBar,
> args);
>             }
>             else
>             {
>                 this.progressBar_Upload.Value = nProgress;
>                 this.progressBar_Upload.Refresh();
>             }
>         }

Benenne Sie um und mach eine Extension Method draus.

geht dann so (ohne diesen ganzen Invoke Kram):
1
public static class extentions{
2
        public static void updateProgress(this ProgressBar bar, int newValue){
3
               bar.Value = newValue;
4
        }
5
}

Beachte: Statische Klasse, Statische Methode

Aufrufen kannst du das dann als wäre es eine Methode der ProgressBar 
Klasse
1
        ProgressBar bar = new ProgressBar();
2
        bar.updateProgress(100); // der Zeiger auf das Object wird implizit mit übernommen.

Hinweis: So geil die ExtentionMethods sind, so sparsam sollte man sie 
eigentlich einsetzten. Das kann sonst ein ziemliches Chaos geben, weil 
Code an stellen steht, an denen man ihn nicht erwartet.


Grüße,

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.