Bonjour à toutes et tous,
Pardon d'avance si la terminologie employée est impropre (juriste de profession).
Débutant, je développe à l'aide de visualstudio une petite appli sur la base du navigateur cefsharp de consultations de bases environnementales et de génération de pdf (pour qu'ils soient annexés à des actes notariés électroniques).
Mon Application Winforms (Class Form1) lors d'un évènement javascript onclick appelle une procédure dans une seconde class (Class Bound) qui elle même appelle une procédure de ma form1 (en fait, je désactive un bouton impression d'une page web et j'attribue à ce bouton un évènement javascript onclick à partir duquel je veux lancer une procédure de création d'un fichier PDF (une impression pdf de la page web).
Mon souci est que cette dernière procédure (création d'un pdf) qui est sur Form1 s'exécute non dans le thread principal mais dans le thread de travail de ma procédure d'appel de la seconde class, ce qui provoque des exceptions 'System.NullReferenceException' dans mon appli.
DANS FORM 1
PUIS L'EVENNEMENT JAVASCRIPT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Browser = New ChromiumWebBrowser("https://www.geoportail.gouv.fr/carte?c=3.164349169221308,46.82989009658934&z=6&l0=DGAC-PEB_BDD_FXX_WM_WMS::GEOPORTAIL:OGC:WMS(1)&l1=GEOGRAPHICALGRIDSYSTEMS.MAPS.3D::GEOPORTAIL:OGC:WMTS==aggregate(0.2265625)&permalink=yes") With { .Dock = DockStyle.Fill } CefSharpSettings.LegacyJavascriptBindingEnabled = True CefSharpSettings.WcfEnabled = True Dim obj As New BoundObject() Browser.JavascriptObjectRepository.Register("bound", obj, True, BindingOptions.DefaultBinder)
LE DEBUT DE LA PROCEDURE DE CREATION DU PDF
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 Private Sub Browser_LoadingStateChanged(sender As Object, e As LoadingStateChangedEventArgs) Handles Browser.LoadingStateChanged path1 = Application.StartupPath & "\temp\" & utilisateur & "\geoportail01.pdf" Dim jsScript As String = "" jsScript = <js><![CDATA[ document.getElementById('print-comment').disabled=true; document.getElementById('print-submit').value='Imprimer'; var element = document.getElementById('print-submit'); element.type = "button"; element.onclick = function (){bound.onClicked(window.getSelection().toString());}; ]]></js> Browser.ExecuteScriptAsync(jsScript) (...) End Sub
ENFIN MA CLASS BOUNDOBJECT
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Public Async Sub PDF_Click() Dim source As String = Await Browser.GetBrowser().MainFrame.GetSourceAsync() (...)
J'ai essayé de lancer Form1.PDF_Click() au moyen d'un délégué sur ma FORM 1 mais rien à faire Form1.PDF_Click() ne s'éxécute pas dans mon thread principal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 Public Class BoundObject Friend browser As ChromiumWebBrowser Public Sub OnClicked(ByVal selected As String) Form1.PDF_Click() End Sub End Class
Je suis perdu, je ne comprends pas comment procéder pour exécuter Form1.PDF_Click() dans le thread principal si appelé de mon autre class.
Il existe surement une autre méthode pour déclencher une procédure à partir d'un évènement javascript sans passer par une class secondaire ou mais je n'ai pas trouvé/compris dans mes lectures.
Merci pour l'aide que vous pourrez m'apporter.
Partager