VB对象的JS对象数组

时间:2014-01-28 12:38:31

标签: javascript arrays vb.net google-maps-api-3

这里有点麻烦。我有各种COM暴露系统,我已经在我的.net软件中实现了谷歌地图(v3)。我现在要做的是,当用户编辑多边形(定义一个区域)时,我将所有路径点发送回.net以存储到我们的数据库中。

我的问题是.Net知道我传回的JS数组的大小是X元素,但就我而言,我无法弄清楚如何在迭代数组时引用这些值。

这是我在JS中使用window.external

的.NET(VB)方法
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是一件轻而易举的事。但我不能为我的生活弄清楚我在背后做错了什么:(

干杯。

1 个答案:

答案 0 :(得分:1)

根据回答like this,您可以使用两种方法与非原始参数进行交互,并调用ObjectForScriptingThis Connect thread表示您应该使用dynamic作为参数类型。

令我惊讶的是,我学到了that VB.NET doesn't have a an equivalent to C#'s dynamic keyword。显然Option Strict OffOption 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.externalWebBrowser.ObjectForScripting时遇到了困难,因为对于任何严重的问题,它都是一个糟糕的API。