0

我基本上合并了我的谷歌地图网络应用程序的两个功能。但我需要后端可以访问的坐标,所以我做了一个Data Table,然后将它传递给 javascript。

但是当我合并代码时,我遇到了一些语法问题(很可能)。

更新:我得到的错误是Operator '+' cannot be applied to operands of type 'string' and 'method group'

更新 #2: Page_Load 代码见下文(如果从该代码触发,则创建数据表和执行主代码)

更新 #3:添加了主页的代码。现在我得到错误:Microsoft JScript runtime error: The value of the property 'initialize' is null or undefined, not a Function object

在 Linevar myLatLng = new google.maps.LatLng(" tblPoints.Rows[i][0].ToString @", " + tblPoints.Rows[i][1].ToString + @");我收到一些与 @" & "的打开/关闭有关的奇怪错误;

任何答案/建议都是可观的..谢谢..

主页代码(调用 JS 函数的地方):

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>maps integ</title>
    <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
</head>
<body>
    <form id="form1" runat="server">
        <div>
        </div>
        <div id="map_canvas" style="width: 100%; height: 100%;"></div>
        <script type="text/javascript">
            window.onload = function (e) {
                initialize();
            }
        </script>
    </form>
</body>
</html>

Page_Load主页中的代码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Latitude"));
            dt.Columns.Add(new DataColumn("Longitude"));
            dt.Columns.Add(new DataColumn("Info"));

            DataRow row = dt.NewRow();
            row["Latitude"] = 28.483109;
            row["Longitude"] = 77.107756;
            row["Info"] = "INFO #1";
            dt.Rows.Add(row);

            row = dt.NewRow();
            row["Latitude"] = 28.483243;
            row["Longitude"] = 77.107624;
            row["Info"] = "INFO #1";
            dt.Rows.Add(row);

            row = dt.NewRow();
            row["Latitude"] = 28.483293;
            row["Longitude"] = 77.107579;
            row["Info"] = "INFO #1";
            dt.Rows.Add(row);

            row = dt.NewRow();
            row["Latitude"] = 28.483359;
            row["Longitude"] = 77.107536;
            row["Info"] = "INFO #1";
            dt.Rows.Add(row);

            row = dt.NewRow();
            row["Latitude"] = 28.483559;
            row["Longitude"] = 77.107273;
            row["Info"] = "INFO #1";
            dt.Rows.Add(row);

            //row = dt.NewRow();
            //row["Latitude"] = 28.4804;
            //row["Longitude"] = 77.1251;
            //dt.Rows.Add(row);

            js.Text = GPSLib.PlotGPSPoints(dt);
        }
    }

类文件的代码:

public static class GPSLib
{
    public static String PlotGPSPoints(DataTable tblPoints)
    {
        try
        {
            String Locations = "";
            String sJScript = "";
            int i = 0;


            foreach (DataRow r in tblPoints.Rows)
            {
                // bypass empty rows 
                if (r["latitude"].ToString().Trim().Length == 0)
                    continue;

                string Latitude = r["latitude"].ToString();
                string Longitude = r["longitude"].ToString();

                // create a line of JavaScript for marker on map for this record 
                Locations += Environment.NewLine + @"
                path.push(new google.maps.LatLng(" + Latitude + ", " + Longitude + @"));

                var marker" + i.ToString() + @" = new google.maps.Marker({
                    position: new google.maps.LatLng(" + Latitude + ", " + Longitude + @"),
                    title: '#' + path.getLength(),
                    map: map
                });";

                i++;

            }

            // construct the final script
            // var cmloc = new google.maps.LatLng(33.779005, -118.178985);

            // map.panTo(curmarker.position); //zooming on current marker's posn.
            // map.panTo(myOptions.getPosition());
            sJScript = @"<script type='text/javascript'>

            var poly;
            var map;

            function initialize() {
                var cmloc = new google.maps.LatLng(28.483243, 77.107624);
                var myOptions = {
                    zoom: 19,
                    center: cmloc,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };

                map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);


                var polyOptions = {
                    strokeColor: 'blue',
                    strokeOpacity: 0.5,
                    strokeWeight: 3
                }
                poly = new google.maps.Polyline(polyOptions);
                poly.setMap(map);

                var path = poly.getPath();

               " + Locations + @"

                    }

            final initPoints(){
         //  var map;
            var infowindow;

            var mapOptions = {
                zoom: 19,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                center: centr
             };

            map = new google.maps.Map(document.getElementById('map_canvas'),
            mapOptions);
            infowindow = new google.maps.InfoWindow();
            drop();


            }

        function drop() {
            for (var i = 0; i < "+ tblPoints.Rows.Count + @"; i++) {
        var myLatLng = new google.maps.LatLng("+ tblPoints.Rows[i][0].ToString+ @", "+ tblPoints.Rows[i][1].ToString + @");
        var mark = new google.maps.Marker({
            position: myLatLng,
            map: map,
        });
    iWindow(mark, "+ tblPoints.Rows[i][2].ToString +@");
   }
}

function iWindow(marker, title) {
    google.maps.event.addListener(marker, 'click', function () {

        infowindow.setContent(title);
        infowindow.open(map, marker);
    });
}
                </script>";
            return sJScript;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}
4

2 回答 2

3

为什么不使用 String.Format 而不是这些串联。它看起来更好,更容易维护并且很可能会解决您的问题?

更新 1:您确定以下代码不能完成这项工作吗?

更新 2:现在开始创建 drop 函数

更新 3:好的,这是我的下一个更新 :)

我建议您使用 this.Page.ClientScript.RegisterStartupScript 而不是文字来将脚本添加到页面。我在 GPSLib 中也做了一些修复。所以这是 Page_Load()

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add(new DataColumn("Latitude"));
        dt.Columns.Add(new DataColumn("Longitude"));
        dt.Columns.Add(new DataColumn("Info"));

        DataRow row = dt.NewRow();
        row["Latitude"] = 28.483109;
        row["Longitude"] = 77.107756;
        row["Info"] = "INFO #1";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Latitude"] = 28.483243;
        row["Longitude"] = 77.107624;
        row["Info"] = "INFO #1";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Latitude"] = 28.483293;
        row["Longitude"] = 77.107579;
        row["Info"] = "INFO #1";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Latitude"] = 28.483359;
        row["Longitude"] = 77.107536;
        row["Info"] = "INFO #1";
        dt.Rows.Add(row);

        row = dt.NewRow();
        row["Latitude"] = 28.483559;
        row["Longitude"] = 77.107273;
        row["Info"] = "INFO #1";
        dt.Rows.Add(row);

        //row = dt.NewRow();
        //row["Latitude"] = 28.4804;
        //row["Longitude"] = 77.1251;
        //dt.Rows.Add(row);

        var script = GPSLib.PlotGPSPoints(dt);

        this.Page.ClientScript.RegisterStartupScript(
            this.GetType(),
            "focus",
            script, false);
    }
}

这是GPSLib

public static class GPSLib
{
    public static String PlotGPSPoints(DataTable tblPoints)
    {
        try
        {
            StringBuilder locations = new StringBuilder();
            StringBuilder drop = new StringBuilder();

            //function drop() {{
            //    for (var i = 0; i < {1}; i++) {{
            //    var myLatLng = new google.maps.LatLng({2}, {3});
            //    var mark = new google.maps.Marker({{
            //        position: myLatLng,
            //        map: map,
            //    }});
            //    iWindow(mark, {4});
            //    }}
            //}}

            drop.AppendFormat(@"function drop() {{{0}", Environment.NewLine);
            int i = 0;
            foreach (DataRow r in tblPoints.Rows)
            {
                // bypass empty rows 
                if (r["latitude"].ToString().Trim().Length == 0)
                    continue;

                string latitude = r["latitude"].ToString();
                string longitude = r["longitude"].ToString();
                string info = r["info"].ToString();

                // create a line of JavaScript for marker on map for this record 
                locations.AppendFormat(@"{0}path.push(new google.maps.LatLng({1}, {2}));

        var marker{3} = new google.maps.Marker({{
            position: new google.maps.LatLng({1}, {2}),
            title: '#' + path.getLength(),
            map: map
        }});", Environment.NewLine, latitude, longitude, i);

                drop.AppendFormat(@"var myLatLng{0} = new google.maps.LatLng({1}, {2});
        var mark{0} = new google.maps.Marker({{
        position: myLatLng{0},
        map: map,
        }});
        iWindow(mark{0}, '{3}');", i, latitude, longitude, info);

                i++;

            }

            drop.Append("}");

            // construct the final script
            // var cmloc = new google.maps.LatLng(33.779005, -118.178985);

            // map.panTo(curmarker.position); //zooming on current marker's posn.
            // map.panTo(myOptions.getPosition());
            string sJScript = string.Format(@"<script type='text/javascript'>

    var poly;
    var map;

    function initialize() {{
        var cmloc = new google.maps.LatLng(28.483243, 77.107624);
        var myOptions = {{
            zoom: 19,
            center: cmloc,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }};

        map = new google.maps.Map(document.getElementById('map_canvas'), myOptions);


        var polyOptions = {{
            strokeColor: 'blue',
            strokeOpacity: 0.5,
            strokeWeight: 3
        }}
        poly = new google.maps.Polyline(polyOptions);
        poly.setMap(map);

        var path = poly.getPath();

        {0}

    }}

    function initPoints(){{
        //  var map;
        var infowindow;

        var mapOptions = {{
            zoom: 19,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            center: centr
            }};

        map = new google.maps.Map(document.getElementById('map_canvas'),
        mapOptions);
        infowindow = new google.maps.InfoWindow();
        drop();
    }}

    {1}

    function iWindow(marker, title) {{
        google.maps.event.addListener(marker, 'click', function () {{

            infowindow.setContent(title);
            infowindow.open(map, marker);
        }});
    }}
    </script>", locations, drop);
            return sJScript;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

这是我的 aspx 页面:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
        </div>
        <script type="text/javascript">
            window.onload = function (e) {
                initialize();
            }
        </script>
    </form>
</body>
</html>
于 2013-02-07T11:15:22.920 回答
1

你忘了一些'+',正确的行是

var myLatLng = new google.maps.LatLng(" + tblPoints.Rows[i][0].ToString + @", " +
                   tblPoints.Rows[i][1].ToString + @");

编辑:

您在 ToString 之后也忘记了(),更正:

var myLatLng = new google.maps.LatLng(" + tblPoints.Rows[i][0].ToString() + @", "
                 + tblPoints.Rows[i][1].ToString() + @");
于 2013-02-07T11:26:52.507 回答