这里有点麻烦。我有各种COM暴露系统,我已经在我的.net软件中实现了谷歌地图(v3)。我现在要做的是,当用户编辑多边形(定义一个区域)时,我将所有路径点发送回.net以存储到我们的数据库中。
我的问题是.Net知道我传回的JS数组的大小是X元素,但就我而言,我无法弄清楚如何在迭代数组时引用这些值。
这是我在JS中使用window.external
Public Sub AreaPointMoved(ByRef obj As Object, ByVal s As String)
MsgBox(s) ' contains a string of lat/lngs from JS
MsgBox(obj.length)
For i As Integer = 0 To obj.length
MsgBox(obj(i).lat & ", " & obj(i).lng) ' this doesn't work
'MsgBox(obj.lat & ", " & obj.lng) ' this doesn't work
Next
End Sub
正在触发set_at
事件时发送回东西的JS:
function DrawAreaOverlay(area, col)
{
var coordsString = "";
var areaCoords = [];
overlayLayer[overlayCount] = new Array();
for(var j=0; j<area.Count; j++)
{
areaCoords.push(new google.maps.LatLng(area.Item(j).lng, area.Item(j).lat));
}
var poly = new google.maps.Polygon({
paths: areaCoords,
strokeColor: col,
strokOpacity: 0.35,
strokeWeight: 2,
fillColor: col,
fillOpacity: 0.25,
geodesic: false,
editable: canEdit,
draggable: canDrag,
map: map
});
overlayLayer[overlayCount].push(poly);
poly.getPaths().forEach(function(path, index){
google.maps.event.addListener(path, 'set_at', function(){
var arrayOfPoints = new Array();
var g = new Array();
arrayOfPoints = poly.getPath();
coordsString = "";
for(var i=0; i<arrayOfPoints.length; i++)
{
//simpleArray[i] = poly.getPath().getAt(i).lat() + ", " + poly.getPath().getAt(i).lng();
geoObj = new Object();
geoObj.lat = poly.getPath().getAt(i).lat();
geoObj.lng = poly.getPath().getAt(i).lng();
g.push(geoObj);
coordsString += poly.getPath().getAt(i).lat() + ", " + poly.getPath().getAt(i).lng() + "|";
}
window.external.AreaPointMoved(g, coordsString);
//alert(path.getLength());
});
});
}
我真的很困惑。将.net中的对象转换为JS是一件轻而易举的事。但我不能为我的生活弄清楚我在背后做错了什么:(
干杯。
答案 0 :(得分:1)
根据回答like this,您可以使用两种方法与非原始参数进行交互,并调用ObjectForScripting
。 This Connect thread表示您应该使用dynamic
作为参数类型。
令我惊讶的是,我学到了that VB.NET doesn't have a an equivalent to C#'s dynamic keyword。显然Option Strict Off
和Option Infer On
达到了同样的目的:
Option Strict Off
Option Infer On
Public Sub AreaPointMoved(ByRef obj As Object, ByVal s As String)
For i As Integer = 0 To obj.length
'late binding to .lat and .lng should work now
' open Debug > Windows > Immediate
Debug.Print(obj(i).lat)
Debug.Print(obj(i).lng)
Next
End Sub
这是未经测试的,因为我无法轻松测试任何此代码。如果这不起作用,则第二个冰雹玛丽是using reflection来调用该属性:
Public Sub AreaPointMoved(ByRef obj As Object, ByVal s As String)
Dim lat As Double
Dim lng As Double
For i As Integer = 0 To obj.length
lat = obj(i).GetType().InvokeMember("lat", BindingFlags.InvokeMethod, Nothing, obj(i), Nothing)
lng = obj(i).GetType().InvokeMember("lng", BindingFlags.InvokeMethod, Nothing, obj(i), Nothing)
' view in Debug > Windows > Immediate
Debug.Print(lat)
Debug.Print(lng)
Next
End Sub
原谅我的VB.NET任何语法错误。我将C#转换为VB.NET的技巧充其量是生锈的。
您是否考虑过使用双打数组?您不应该只需要传递坐标的对象属性:
Public Sub AreaPointMoved(ByVal coordinates()() As Double)
End Sub
for(var i=0; i<arrayOfPoints.length; i++)
{
g.push([poly.getPath().getAt(i).lat(), poly.getPath().getAt(i).lng()]);
}
window.external.AreaPointMoved(g);
希望其中一个可以帮助你解决这个问题。祝你好运!
补充工具栏:我强烈建议在Windows WebBrowser控件(这是Internet Explorer的COM互操作包装器)上使用Chromium Embedded Framework (CEF)或Awesomium。使用基于Chromium over IE的浏览器,将Google地图嵌入桌面应用程序会变得更加顺畅。 CEF和Awesomium都有更丰富的方法来完成.Net IL和Javascript之间的双向调用。您在使用window.external
和WebBrowser.ObjectForScripting
时遇到了困难,因为对于任何严重的问题,它都是一个糟糕的API。