2012-06-05 39 views
9

Sử dụng WebBrowser trên Biểu mẫu và gọi vào C# từ Javascript bằng window.external. Đi qua trong một mảng javascript của các tầng lớp trong hàm:Truy cập các phần tử mảng JavaScript từ C# (thông qua WebBrowser)?

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

window.external.CSharpFunction(x); 

tôi thành công có thể nhận được x.length trong C# với:

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

Câu hỏi của tôi là làm thế nào để tôi nhận được x [0] và x [ 1]? Tôi đã thử

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

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

cả hai đều bắn ra lỗi trong tầm kiểm soát WebBrowser.

Cảm ơn

+0

Cố gắng gọi "0" thành viên? (Giống như với thành viên "chiều dài"). –

+0

Không: "0" cũng gây ra lỗi. –

Trả lời

5

Xin xem câu hỏi này SO:

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

Tôi cũng đã cố gắng để lấy các giá trị từ tài sản trên các đối tượng trong mảng không thành công. Lấy các giá trị đơn giản trong mảng, chẳng hạn như chuỗi và số nguyên là dễ dàng, nhưng không có may mắn với các đối tượng phức tạp.

Đặt cược tốt nhất (IMO) của bạn là triển khai giải pháp tương tự như giải pháp trong câu hỏi SO ở trên. Thay vì truyền mảng trực tiếp, hãy xây dựng một phương thức Javascript có thể được gọi từ C# để trả về đối tượng trong mảng tại chỉ mục đã chỉ định. Cũng giống như vậy:

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

Tôi đã cố gắng tránh điều này nhưng có vẻ như đây là kết quả dễ nhất ngay bây giờ. Tôi chỉ cần đặt một hàm JavaScript đơn giản: 'hàm GetItem (mảng, chỉ mục) { mảng trả về [index]; } ' và gọi từ C#: ' _webBrowser.Document.InvokeScript ("GetItem", đối tượng mới [2] {mảng, chỉ mục}); ' –

Các vấn đề liên quan