Autor Beitrag
DMW007
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 09.02.10 19:18 
Hi,

ich habe ein Problem mit C#, das lautet wie folgt:

Ich moechte mittels eines WebClients eine Datei auf einen Server via FTP hochladen und den Fortschritt auslesen koennen. Dafuer nutze ich die client.UploadFileAsync Methode und aboniere das UploadProgressChanged Event

ausblenden C#-Quelltext
1:
client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressCallback);					


In diesem Event kann ich dann wunderbar die schon uebertragene Datenmenge und den Fortschritt auslesen

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
 private static void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e)
        {
               int gesendet = e.Bytes.Send;
               int gesammt = e.TotalBytesToSend;
               int fortschritt = e.ProgressPercentage;
        }


Das Problem:
Das Event muss, warumm auch immer ein statisches Feld sein. Das bringt das Problem mit sich, dass ich aus diesem Event aus nicht auf meine Steuerelemente auf der Form zugreifen moechte. Ich kann auch nicht einfach einen int fuer die jeweiligen Werte global deklarieren, aus dem Event kann ich auch darauf nicht zugreifen. Das ist sehr schlecht, da ich den Fortschritt und die bereits gesendete Datenmenge auf der WinForm auf einem Label bzw den Fortschritt auf einer ProgressBar ausgeben moechte.

In meinem ersten Funktionstest auf der Console war das ganze kein Problem, da konnte ich die Werte auf der Console ausgeben.

Jetzt ist nur die Frage:

Wie kann ich auf meine WinForm Controls zugreifen? Einfach "static" entfernen ist nicht, dann erhalte ich die Fehlermeldung dass das Event ein statisches Feld sein muss...

In Visual Basic habe ich dasselbe schonmal gecodet, also einen Datenupload via WebClient mit dem UploadChanged event. Da habe ich einfach einen WebClient mit Events deklariert und dann ein Sub gehabt in dem ich, wie unter C# im UploadProgressChanged Event den Fortschritt auslesen konnte. Dabei hatte ich jedoch keine Probleme mit einem statischen Feld.

Hoffe jemand weiß Rat...

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 09.02.10 19:21 
Hallo und :welcome:!

user profile iconDMW007 hat folgendes geschrieben Zum zitierten Posting springen:
Das Event muss, warumm auch immer ein statisches Feld sein.
Genau das ist doch hier die Frage: Warum muss es das sein? Mir fällt kein Grund ein.

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
DMW007 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 09.02.10 19:26 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und :welcome:!

user profile iconDMW007 hat folgendes geschrieben Zum zitierten Posting springen:
Das Event muss, warumm auch immer ein statisches Feld sein.
Genau das ist doch hier die Frage: Warum muss es das sein? Mir fällt kein Grund ein.

Grüße
Christian


Hi :)

Mir ja auch nicht... Ich arbeite das erste mal mit der UploadFile Methode des WebClients in C#, daher kann ich mir das nicht erklaeren.

Da Der Decomplierer wie oben bereits einen Fehler meldet wenn ich das Event in ein nicht statisches Feld aendere muss ja irgendwas nicht stimmen...
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 09.02.10 19:30 
Dann zeig mal, wo der Fehler gemeldet wird und wie der lautet. Ich glaube, da liegt irgendwo anders was im argen ;-)

Und bitte unterscheide zwischen Feldern, Events und Methoden. Bei Dir ist die Methode statisch, das Event des WebClients ist es nicht.


//EDIT: Mir fällt übrigens gerade ein, dass der WebClient eh nicht für FTP-Übertragungen da ist ;-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
DMW007 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 09.02.10 19:58 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Dann zeig mal, wo der Fehler gemeldet wird und wie der lautet. Ich glaube, da liegt irgendwo anders was im argen ;-)

Und bitte unterscheide zwischen Feldern, Events und Methoden. Bei Dir ist die Methode statisch, das Event des WebClients ist es nicht.


//EDIT: Mir fällt übrigens gerade ein, dass der WebClient eh nicht für FTP-Übertragungen da ist ;-)


Ja ich habe da ab und an ein bisschen Probleme mit der Ausdrucksweise...

Wenn ich die statische Methode in eine normale abaendere, also einfach das 'static' entfernen wie es normal funktionieren sollte, erhalte ich beim abonieren des Events

ausblenden C#-Quelltext
1:
client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressCallback);					


dann logischerweise nur beim neuen Eventhandler, also dem folgenden Teil

ausblenden C#-Quelltext
1:
new UploadProgressChangedEventHandler(UploadProgressCallback);					


Der Fehler lautet:

"Für das nicht statische Feld, die Methode oder die Eigenschaft ''TestApplication.Form1.UploadProgressCallBack(object, System.Net.UploadProgressChangedEventArgs) '' ist ein Objektverweis erforderlich"

Ja ich weiß, eigentlich ist der WebClient nicht fuer Datenuebertragungen via FTP da, es funktioniert jedoch trotzdem :)

In VisualBasic habe ich frueher viel damit gearbeitet, hat immer problemlos funktioniert.

Der Upload via FTP mit dem WebClient funktioniert unter C# ja ebenfalls reibungslos, das Problem ist nur dass ich den Fortschritt nicht an meine WinForm uebergeben kann :(
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 09.02.10 20:09 
Wie und wo ist client deklariert und wo wird die Zuweisung des Events aufgerufen? Ich habe die Vermutung, dass da irgendwo noch was anderes statisch ist und deshalb auch der Eventhandler statisch sein muss.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 09.02.10 20:18 
Hallo,

meine Vermutung geht dahin: client ist eine Instanz von "irgendetwas" ist, und UploadProgressCallBack ist eine Methode der Klasse Form1. Das würde bedeuten, dass client's EventHandler mit einer Methode von Form1 verbunden werden soll; und dafür wird laut Fehlermeldung eine bestimmte Instanz von Form1 - z.B. myMainForm - benötigt. Also müsste es etwa so gehen:
ausblenden C#-Quelltext
1:
2:
client.UploadProgressChanged 
  += new UploadProgressChangedEventHandler(myMainForm.UploadProgressCallback);

Dies setzt natürlich voraus, das client auf myMainForm zugreifen darf. Wahrscheinlich ist es eher umgekehrt; dann benötigst du in der client-Klasse etwas in der folgenden Art:
ausblenden C#-Quelltext
1:
2:
3:
4:
public void SetUploadProgressChanged(UploadProgressChangedEventHandler myEventHandler) 
{
  UploadProgressChanged += myEventHandler;
}

mit dem Aufruf von myMainForm aus:
ausblenden C#-Quelltext
1:
client.SetUploadProgressChanged(UploadProgressCallback);					

Gruß Jürgen
DMW007 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Di 09.02.10 20:20 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Wie und wo ist client deklariert und wo wird die Zuweisung des Events aufgerufen? Ich habe die Vermutung, dass da irgendwo noch was anderes statisch ist und deshalb auch der Eventhandler statisch sein muss.


Oh man...

Genau das war's !

Ich suche nach den kompliziertesten Fehlerquellen, aber daran habe ich nicht gedacht...

Ich habe eine Methode fuer den Upload, in dieser Methode wird dann auch der Eventhandler abboniert...

Die Methoden habe ich aus der Console, in der ich das ganze zuerst getestet hatte direkt uebernommen, und natuerlich uebersehen die UploadMethode ebenfalls anzupassen...

Das passiert immer wieder gerne, 2h auf Fehlersuche bis man dann irgendeine Kleinigkeit entdeckt...

Viele Dank fuer die Hilfe! :)

Laeuft nun alles 1A :)