Frage

Wir haben eine Windows-Anwendung, die ein ActiveX-WebBrowser-Steuerelement enthält. Im Rahmen des regulären Betriebes dieser Anmeldung Modifikationen an den Seiten vorgenommen werden, die durch das Web-Browser ActiveX-Steuerelement angezeigt werden. Ein Teil dieser Modifikationen beinhaltet Einstellung ein JavaScript-Variable in einer Web-Seite in das WebBrowser ActiveX geladen.

Wir brauchen diese Variable in C # initialisieren (ursprünglich, VB6-Code wurde der Wert initialisiert). Der Wert dieser Variablen ist ein COM-Objekt sichtbar Klasse.

Doch der Einfachheit halber haben wir das Problem der Einstellung einen String-Wert reduziert. Unsere ursprüngliche Seite beinhaltet Frames und dergleichen, aber die gleichen Probleme geschieht in einer Seite wie folgt aus:

<HTML>
 <HEAD>
  <TITLE>Test</TITLE>
  <SCRIPT type="text/javascript">
   var field = 'hello world';
  </SCRIPT>
 </HEAD>
 <BODY>
   <input type="button" value="See field" onclick="javascript:alert(field);"/>
 </BODY>
</HTML>

Wir wollen die Feld zuzugreifen Variable und einen Wert zuweisen. In VB6 war der Code für diese ziemlich einfach:

doc.Script.field = 'newValue'

Doch in C # wir mussten auf andere Tricks greifen, wie folgt aus:

Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateSet(Script, null, "field",new object[] { "newValue"},null, null);

Der Punkt der Seite ist zu prüfen, ob unsere Variable richtig von C # zugeordnet wurde. Ein Klick auf den Button sollte, was auch immer neue Wert ergeben, wurde von C # injiziert. So zum Beispiel auf der Seite auf den Button klicken, erhalten wir eine Benachrichtigung zeigt: „newValue“

.

Das funktioniert beim ersten Mal, aber es funktioniert nicht, wenn wir die Seite neu. Bei nachfolgenden Aufrufen können wir nicht den Wert der Variablen field gesetzt.

Hat jemand hatte keine Erfahrung, diese Art von Operation zu tun vor?

War es hilfreich?

Lösung 3

Diese beiden Artikel hat uns geholfen, eine Lösung für unser Problem zu finden. Sie umreißen die Grundlagen dessen, was muss man wissen:

Microsoft Webbrowser Automation mit C #

Mit MSHTML Erweiterte Hosting Interfaces

So haben wir ein DocHostUIHandler Schnittstelle und erlaubt uns eine UIHandler zu setzen, so dass wir die Methode von Javascript verweisen.

Andere Tipps

Ich denke, was Sie suchen die eval() Methode in Javascript ist. Sie können es von C # wie folgt aufrufen:

webBrowser1.Document.InvokeScript("eval", new String[] {"1 + 2"});

Dieser Code wird "1 + 2" bewerten und das Rück "3". Ich könnte mir vorstellen, dass, wenn Sie waren setzen in

InvokeScript("eval", new String[] {"varName = 3"})

Sie würde diese Variable erhalten zugewiesen 3, wenn es global sichtbar in der Datei ist.

Wenn Sie das WebBrowser-Steuerelement verwenden, können Sie ein c # Objekt das zuweisen ObjectForScripting Eigenschaft http://msdn.microsoft.com/ en-us / library / system.windows.forms.webbrowser.objectforscripting.aspx

nach, dass Sie in Ihrem Javascript verwenden window.external mit Ihrem c # Objekt von Javascript zu interagieren

Wenn Sie eine ActiveX-Version aus irgendeinem Grund verwenden, können Sie Javascript passieren. Urls Ihre Variable programmatisch setzt, oder Sie können Ihr Skript mit einem Webservice / Datenbank / Datei oder einfach mit der Methode syncronisieren Sie vorgeschlagen

Die übliche Methode, die wir verwenden, ist ein verstecktes Texteingabefeld (die ASP.Net Steuer Version) auf der Seite hinzuzufügen. Auf diese Weise können Sie ganz einfach ihren Wert in dem C # Code-Behind einstellen und den Wert in Client-Seite JavaScript (und umgekehrt, natürlich) lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top