2012-06-05 15 views
9

Verwenden von WebBrowser in einem Formular und Aufrufen von C# aus Javascript mit window.external. Passing in einem Javascript-Array von Klassen in der Funktion:Zugriff auf JavaScript-Array-Elemente von C# (über WebBrowser)?

int length=(int)x.GetType().InvokeMember("length", BindingFlags.GetProperty, null, x, null); 

Meine Frage ist, wie bekomme ich x [0] und x [:

var x = []; 
x.push(classa); 
x.push(classa); 

window.external.CSharpFunction(x); 

ich erfolgreich x.length in C# mit bekommen kann 1]? Ich habe

versucht
x.GetType().InvokeMember(string.Empty, BindingFlags.GetProperty, null, x, new object[1]{1}); 

und

x.GetType().InvokeMember(string.Empty, BindingFlags.InvokeMethod | BindingFlags.Default, null, x, new object[1]{0}); 

welche beide Fehler innerhalb des WebBrowser Steuerelement abfeuern.

Dank

+0

Versuchen Sie, die "0" Mitglied zu berufen? (Genau wie beim "length" -Mitglied.) –

+0

Nein: "0" verursacht auch einen Fehler. –

Antwort

5

Bitte sehen Sie diese Frage SO:

Accessing properties of javascript objects using type dynamic in C# 4

Ich habe auch ohne Erfolg abzurufen Werte von Eigenschaften auf Objekte im Array versucht. Das Abrufen von einfachen Werten im Array, z. B. Strings und Ganzzahlen, ist einfach, hat jedoch bei komplexen Objekten kein Glück gehabt.

Ihre beste Wette (IMO) ist die Implementierung einer ähnlichen Lösung wie in der obigen SO-Frage. Erstellen Sie stattdessen eine JavaScript-Methode, die aus C# aufgerufen werden kann und das Objekt im Array am angegebenen Index zurückgibt, anstatt das Array direkt weiterzuleiten. Wie so:

C#

public void CSharpFunction(dynamic length) 
{ 
    for (int i = 0; i < length; i++) 
    { 
     dynamic obj = webBrowser1.Document.InvokeScript("getObj", new object[] { i }); 

     string val = obj.MyClassValue; 
    } 
} 

HTML/JavaScript

<script type="text/javascript"> 

var x = []; 
x.push({MyClassValue: "Hello"}); 
x.push({MyClassValue: "People"}); 

function test() { 
    window.external.CSharpFunction(x.length); 
} 

function getObj(i) { 
    return x[i]; 
} 

</script> 
<button onclick="test();" /> 
+0

Ich habe versucht, dies zu vermeiden, aber es sieht aus wie es ist das einfachste Ergebnis im Moment. Ich habe einfach eine einfache JavaScript-Funktion eingefügt: 'Funktion GetItem (Array, Index) { Return-Array [Index]; } ' und rief das aus C#: ' _webBrowser.Document.InvokeScript ("GetItem", neues Objekt [2] {Array, Index}); ' –