2012-06-05 20 views
9

Korzystanie z WebBrowser na formularzu i wywoływanie w języku C# z Javascript za pomocą window.external. Przechodząc w tablicy JavaScript zajęć w funkcji:Dostęp do elementów tablicy JavaScript z języka C# (przez WebBrowser)?

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

window.external.CSharpFunction(x); 

mogę z powodzeniem dostać x.length w C#:

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

Moje pytanie brzmi jak mogę x [0] x [ 1]? Próbowałem

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

i

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

oba wystrzelić błędy w kontroli WebBrowser.

Dzięki

+0

spróbować powołać człon "0"? (Podobnie jak w przypadku elementu "długość".) –

+0

Nie: "0" powoduje również błąd. –

Odpowiedz

5

Proszę zobaczyć to, więc pytanie:

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

Mam również próbował odzyskać wartości od właściwości obiektów w tablicy bez powodzenia. Pobieranie prostych wartości w tablicy, takich jak łańcuchy i liczby całkowite, jest łatwe, ale nie ma szczęścia w przypadku złożonych obiektów.

Twój najlepszy zakład (IMO) polega na wdrożeniu podobnego rozwiązania, jak w powyższym pytaniu dotyczącym SO. Zamiast bezpośrednio przekazywać tablicę, należy zbudować metodę Javascript, która może zostać wywołana z C#, która zwróci obiekt w tablicy o określonym indeksie. Tak:

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

Próbowałem tego uniknąć, ale teraz wygląda na to, że jest to najłatwiejszy wynik. Po prostu wstawiłem prostą funkcję JavaScript: 'funkcja GetItem (tablica, indeks) { tablica zwracana [indeks]; } '} i wywołałem to z C#: ' _webBrowser.Document.InvokeScript ("GetItem", nowy obiekt [2] {tablica, indeks}); ' –

Powiązane problemy