Avatar billede webcreator Nybegynder
14. august 2008 - 17:39 Der er 3 kommentarer og
1 løsning

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();
        }
    }
}
Avatar billede webcreator Nybegynder
15. august 2008 - 09:24 #1
Hvis der sidder en ekspert derude i dag, så hører jeg meget gerne fra dig. Sidder netop og er påbegyndt arbejdet igen, og det driller fortsat.
Avatar billede webcreator Nybegynder
15. august 2008 - 10:03 #2
Min sidste umiddelbare udvej var brugen af en Timer. Underligt nok fungerede denne løsning. Hvordan den helt specifikt er forskellige fra en Thread er jeg ikke klar over, så hvis der er nogen der kan bidrage til løsning af mysteriet, hører jeg fortsat gerne fra dig :)
Avatar billede webcreator Nybegynder
15. august 2008 - 10:03 #3
Det skal lige siges at jeg bruge den alm. WebBrowser komponent, og lavede Timer'en på min Form.
Avatar billede webcreator Nybegynder
15. august 2008 - 12:25 #4
Jeg kom i tanke om, at Timeren sandsynligvis nok håndteres af en tråd lavet af .NET, men at selve Timer Tick'et fungerer som et event, der bliver affyret. Dermed afvikles mit print i min Worker Thread, hvorfor tingene naturligvis virker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester