Forum: PC-Programmierung C# PictureBox visable true / false zwischen Klassenaufruf


von Jonas (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:

- eine PicutreBox wird per Code geleert
- danach folgt ein Funktionsaufruf über eine Klasse
- die PictureBox soll je nach Rückgabewert der Klasse ein Bild anzeigen

Das funktioniert soweit alles, nur werden die Bilder erst am Ende aller 
Funktionsaufrufe angezeigt und nicht nachdem eine Aktion abgeschlossen 
wurde. In meiner Klasse werden diverse Dateien erzeugt und das dauert 
eine gewisse Zeit. Der aktuelle Status wird bei ProgressBar angezeigt, 
das Steuerelement wird von der Form mit an die Klasse übergeben und dort 
werden die Werte gesetzt. Die ProgressBar wird auch korrekt dargestellt, 
nur die Bilder tauchen erst später auf.

Woran liegt das? Mit Threading habe ich auch schon experimentiert - ohne 
Erfolg.


Code aus meiner Form, wird über einen Button gestartet:
1
picBoxTXT.Image  = null;
2
picBoxXML.Image  = null;
3
picBoxHTML.Image = null;
4
            
5
if (classOutputData.vWriteTXT(pbWriteStatus, txtFolder.Text, strFileName))
6
    picBoxTXT.ImageLocation = Application.StartupPath + "\\img\\err.png"; 
7
else
8
    picBoxTXT.ImageLocation = Application.StartupPath + "\\img\\ok.png"; 
9
       
10
                 
11
if (OutputData.vWriteXML(pbWriteStatus, txtFolder.Text, strFileName))
12
    picBoxXML.ImageLocation = Application.StartupPath + "\\img\\err.png"; 
13
else
14
    picBoxXML.ImageLocation = Application.StartupPath + "\\img\\ok.png"; 
15
16
17
if (OutputData.vWriteHTML(pbWriteStatus, txtFolder.Text, strFileName))
18
    picBoxHTML.ImageLocation = Application.StartupPath + "\\img\\err.png"; 
19
else
20
    picBoxHTML.ImageLocation = Application.StartupPath + "\\img\\ok.png";


Auszug aus meiner Klasse:
1
vWriteTXT(ProgressBar pbNewValue, string strPath, string strFileName)
2
{
3
    pbValue = pbNewValue;
4
5
    pbValue.Minimum = 0;
6
7
    pbValue.Maximum = 100;
8
9
    // erzeuge Datei
10
11
    pbValue.Value = wStatus;
12
13
   // usw...
14
   wStatus++;
15
}

von Peter P. (Gast)


Lesenswert?

Hallo,

das liegt daran, daß du vWriteTxt vermutlich aus dem UI-Thread aus 
aufrufst und der einfach keine Zeit zum Neu-Zeichnen hat (weil er 
irgendwelche Files erstellt).

Die saubere Lösung wäre es, lange Prozesse in eigene Threads auszulagern 
(BackgroundWorker, ...)

lg

von Frank M. (aktenasche)


Lesenswert?

kann sein dass du das form refreshen musst, zb über die invalidate 
methode.

http://msdn.microsoft.com/de-de/library/system.windows.forms.control.invalidate.aspx

ändert nichts dran dass man das so eigentlich nicht macht ;)
wie schon bereits gesagt solltest du die schreibmethoden auslagern, 
backgroundworker sind mit abstand am leichtesten zu handhaben

BackgroundWorker worker = new BackgroundWorker();

BackGroundworker.DoWork += (TAB TAB drücken);
in die entstandene methode den saver reinklatschen

BackGroundWorker.RunWorkerCompleted+= (TAB TAB drücken);
hier den die image property neu setzen und refreshen

BackGroundworker.ProgressChanged += (TAB TAB);

BackGroundworker.RunWorkerAsync();

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.