DotNetBrowser вызывает функцию JavaScript для C # - PullRequest
0 голосов
/ 12 июня 2018

У меня есть этот код JS, который я использую для отображения вида улиц и карт Google в моей форме:

/*
       * Click the map to set a new location for the Street View camera.
       */
var icon;
var markers = [];
var currentmarker;
var geocoder, infowindow;
var map;
var panorama;
var sv;

function initMap() {
    var berkeley = { lat: 39.277782, lng: -7.428514 };
    sv = new google.maps.StreetViewService();
    panorama = new google.maps.StreetViewPanorama(document.getElementById('pano'));
    // Set up the map.
    map = new google.maps.Map(document.getElementById('map'), {
        center: berkeley,
        zoom: 17,
        streetViewControl: false
    });
    sv.getPanorama({ location: berkeley, radius: 70 }, processSVData);

    geocoder = new google.maps.Geocoder;
    infowindow = new google.maps.InfoWindow;
    map.addListener('click', function (event) {
        sv.getPanorama({ location: event.latLng, radius: 70 }, processSVData);
    });
    document.getElementById('submit').addEventListener('click', function () {
        var input = document.getElementById("resulttest");     /*latlng*/
        var latlngStr = input.value.split(',', 2);
        geocodeLatLng(latlngStr);
    });
    // Set the initial Street View camera to the center of the map
    // Look for a nearby Street View panorama when the map is clicked.
    // getPanoramaByLocation will return the nearest pano when the
    // given radius is 50 meters or less.

}

function geocodeLatLng(latlngStr) {
    // var input = document.getElementById("resulttest");     /*latlng*/
    latlngStr = latlngStr.split(',', 2);
    var latlng = { lat: parseFloat(latlngStr[0]), lng: parseFloat(latlngStr[1]) };
    geocoder.geocode({ 'location': latlng }, function (results, status) {
        if (status === 'OK') {
            if (results[1]) {
                center: latlng,
                    map.setZoom(20);
                var marker = new google.maps.Marker({
                    position: latlng,
                    map: map
                });
                markers.push(marker);
                infowindow.setContent(results[1].formatted_address);
                infowindow.open(map, marker);
                sv.getPanorama({ location: latlng, radius: 70 }, processSVData);
            } else {
                window.alert('No results found');
            }
        } else {
            window.alert('Geocoder failed due to: ' + status);
        }
    });
}
function processSVData(data, status) {
    if (status === 'OK') {
        var marker = new google.maps.Marker({
            position: data.location.latLng,
            map: map,
            title: data.location.description
        });
        markers.push(marker);
        panorama.setPano(data.location.pano);
        panorama.setPov({
            heading: 270,
            pitch: 0
        });
        panorama.setVisible(true);
        marker.addListener('click', function () {
            var markerPanoID = data.location.pano;
            // Set the Pano to use the passed panoID.
            panorama.setPano(markerPanoID);
            panorama.setPov({
                heading: 270,
                pitch: 0
            });
            panorama.setVisible(true);
        });
    } else {
        console.error('Street View data not found for this location.');
    }
}

function OnclickMarker(data, status) {
    if (status === 'OK') {
        panorama.setPano(data.location.pano);
        panorama.setPov({
            heading: 270,
            pitch: 0
        });
        panorama.setVisible(true);
    } else {
        console.error('Street View data not found for this location.');
    }
}

function setMapOnAll(map) {
    for (var i = 0; i < markers.length; i++) {
        markers[i].setMap(map);
    }
}
function clearOverlays() {
    setMapOnAll(null);
}

function showMarkers() {
    setMapOnAll(map);
}

function criarMarker(id, lat, lon) {
    alert(id + '   ' + lat + ' ' + lon);
    var LatLng = { lat: lat, lng: lon };
    var marker = new google.maps.Marker({
        id: id,
        position: LatLng,
        map: map
    });


    google.maps.event.addListener(marker, 'click', function () {
        this.setIcon('https://www.google.com/mapfiles/marker_green.png');
        sv.getPanorama({ location: LatLng, radius: 70 }, OnclickMarker);
        if (currentmarker != null) {
            currentmarker.setIcon('http://maps.google.com/mapfiles/ms/icons/red-dot.png');
            panorama.setPov({
                heading: 165,
                pitch: 0
            });
        }
        currentmarker = this;



        //alert(lat);
        //var evente = document.createEvent('MessageEvent');
        //    var origina = window.location.protocol + '//' + window.location.host;
        //evente = new MessageEvent('jsCall', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': 'criarMarker' });
        //document.dispatchEvent(evente);


        var evente = document.createEvent('MessageEvent');
        var origina = window.location.protocol + '//' + window.location.host;
        evente = new MessageEvent('jsCall', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': id });
        document.dispatchEvent(evente);

    });

}

Я хотел бы вызвать функцию "criarMarker" и этого маленького парня "jscall", но я не могу этого сделать.Пробовал использовать: browser.ExecuteJavaScript("criarMarker('" + item.id + "'," + item.lat + "," + item.lon + ");");, и когда я запускаю программу, она показывает вывод в изображении:

This output

, но не добавляет маркеры на карту.Есть идеи?Цените усилие!

РЕДАКТИРОВАТЬ Плюс Инфо : Согласно моему ответу, на самом деле мне нужна помощь в вызове "jsCall", ранее я использовал geckobrowser и использовал "AddMessageEventListener" в моем c #, но теперь кажется, чтоЯ не могу назвать это geckoWebBrowser1.AddMessageEventListener("jsCall", (id) =>, это то, что я использовал в моем предыдущем коде.

Другое редактирование: я изменил последние 4 строки моего JS, чтобы сделать его функцией, и теперь выглядит так:

function newFunction(evente, id) {
evente = new MessageEvent('jsCall', { 'view': window, 'bubbles': false, 'cancelable': false, 'data': id });
return evente;

Также, если это сбивает с толку, весь смысл, когда я нажимаюмаркер это меняет мою строку dgv.Но на самом деле ничего не происходит, и я действительно не знаю почему, мой код для dgv такой:

                    int rowindex = -1;
                dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (row.Cells["Edificio_cad"].Value.ToString().Equals(id))
                    {

                        rowindex = row.Index;
                        dataGridView1.Rows[rowindex].Selected = true;
                        dataGridView1.FirstDisplayedScrollingRowIndex = rowindex;
                        //MessageBox.Show(edificios);
                        //Console.WriteLine(edificios);
                        MessageBox.Show(lat);
                        return;

                    }
                    else
                    {
                        //dataGridView1.ClearSelection();
                    }
                }

Благодарю за помощь.

1 Ответ

0 голосов
/ 14 июня 2018

Я добавил это и работал

  browser.FinishLoadingFrameEvent += (s, e) =>
        {
            if (e.IsMainFrame)
            {
                foreach (var item in edificios)
                {
                    browser.ExecuteJavaScript("criarMarker('" + item.id + "'," + item.lat + "," + item.lon + ");");

                }
                //browser.ExecuteJavaScript("jsCall");
            }
        };

Теперь мне нужно вызвать этот "jsCall".Если я смогу это сделать, я добавлю к этому ответу также!

...