WebBrowser - Print når siden er færdig
Hej Eksperter.Jeg har lavet en formular med en WebBrowser komponent, som jeg ønsker automatisk skal udskrive til printeren, når siden er færdig-renderet. Dette lyder måske ikke som den store udfordring, da WebBrowser har eventet DocumentCompleted, der affyres når alle data er hentet og renderet. Dette event tager dog ikke hensyn til at websitet kan have JavaScript implementeret, der bygger videre på siden.
Jeg har derfor lavet min egen WebBrowser-komponent, der arver fra .NETs WebBrowser. Denne fremgår nedenfor. Her vil I se, at jeg med metoden StartPrinting() som "indgangs-metode" starter et print-job, hver gang en ændring bliver registreret på siden. Sker der en ændring i løbet af de første X millisekunder (givet ved værdien af 'wait' på klassen), annulleres det første job, og der laves en ny tråd med det nye print-job. På den måde skulle jeg gerne få et print, når der ikke har været ændringer i en given tid.
Problemet er naturligvis, at skidtet ikke fungerer. Det lader til, at man ikke kan kalde metoderne på WebBrowser fra en tråd overhovedet.
Nu er det år og dag siden at jeg sidst har arbejdet med trådning i .NET - jeg er vant til at lave mindre Thread-klasser i Java, så måske har jeg overset eller glemt noget.
Kan I hjælpe? På forhånd tak :)
=================================================
using System;
using System.Windows.Forms;
using System.Threading;
namespace MyNameSpace
{
class MyWebBrowser : WebBrowser
{
private Thread t;
private int wait;
private bool keepPrinting;
public MyWebBrowser()
{
this.t = null;
this.wait = 0;
this.keepPrinting = false;
}
public void StartPrinting(int ms)
{
this.wait = ms;
this.keepPrinting = true;
this.DocumentCompleted += new MyWebBrowserDocumentCompletedEventHandler(MyWebBrowser_DocumentCompleted);
}
private void doPrint()
{
Thread.Sleep(this.wait);
this.Print();
this.keepPrinting = false;
}
private void MyWebBrowser_DocumentCompleted(object sender, MyWebBrowserDocumentCompletedEventArgs e)
{
this.t = new Thread(doPrint);
t.Start();
this.ProgressChanged += new MyWebBrowserProgressChangedEventHandler(MyWebBrowser_ProgressChanged);
}
private void MyWebBrowser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
if (this.keepPrinting == false)
return;
if (this.t != null)
this.t.Abort();
this.t = new Thread(doPrint);
t.Start();
}
}
}