[VB NET] Passare parametri a una pagina HTML

domenica 15 febbraio 2009 - 20.47

alexmed Profilo | Guru

Ciao a tutti

Nel mio Form ho due Textbox e un WebBrowser

txtLong
txtLati
WebBrowser1

Al click di un Button apro una pagina HTML in locale.
WebBrowser1.Navigate(New Uri("F:\Visual Studio 2005\Projects\Maps\web\default.htm"))

La pagina HTML contiene questo codice

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Vorrei che quando apro questa pagina le coordinate geografiche vengano prelevate dai due TextBox.
L'unica cosa che mi viene in mente è riscrivere il file "default.htm" ogni volta che clicco sul Button.
C'è qualche altra soluzione?

Ciao
alexmed

Gianni77 Profilo | Junior Member

Le variabili ad una pagina html (php, asp ecc) si passano tramite la querystring, che viene identificata dal punto interrogativo dopo la pagina, esempio:

voglio passare la variabile id con valore 100 e la variabile ud con valore 20 alla pagina prova.html:

http://www.blabla.com/prova.html?id=100&ud=20

il problema ora è intercettare queste variabili da html. L'html puro non permette di intercettare le variabili, da html puoi provare in javascript:

<script language="javascript">
var querystring = location.search;
</script>

in questo modo la variabile querystring contiene tutta la parte: ?id=100&ud=20
fai la prova mettendo la stampa della querystring:

<script language="javascript">
var querystring = location.search;
document.write(querystring);
</script>

vedi che ti stampa a video tutta la parte da ? in poi. Il problema ora è separare le variabili che ti servono. Purtroppo posso esserti di aiuto fin qui perchè il javascript lo conosco poco, in genere questi problemi qui li risolvo in php. Ma penso di averti messo sulla strada giusta...

Gianni77 Profilo | Junior Member

Aspetta, cercando bene come estrarre una querystring con javascript ho trovato proprio una funzione che ti puo essere utile:

http://www.sastgroup.com/tutorials/leggere-il-contenuto-di-una-querystring-in-javascript

tieni conto che per far scrivere una stringa sul documento con javascript basta che utilizzi document.write(stringa), dove in stringa puoi concatenare variabili e parti di testo utilizzando l'operatore +, in maniera da fargli scrivere proprio il testo che ti interessa.

alexmed Profilo | Guru

Ciao e grazie
ma ciò che mi scrivete non riesco a capire se posso gestirlo direttamente da VB dentro un WinForm.
In caso affermativo avrei bisogno, per capire meglio, di qualche riga di codice in più o di qualche link che spiega come funziona.

@Gianni77

Questo l'ho capito
http://www.blabla.com/prova.html?id=100&ud=20

Però nel codice che ho postato non ci sono variabili ... o si?
Io devo passare il contenuto delle due textBox a questa riga
>map.LoadMap(new VELatLong(47.6, -122.33), 10 ,'h' ,false);
Sostituendo il 47.6 ed il -122.33
Quello che mi chiedo è questo
Se io sostituisco i valori con due "variabili" (ammesso che così facendo lo siano)
map.LoadMap(new VELatLong('LON', 'LAT'), 10 ,'h' ,false);
Come faccio a impostare i valori con www.....html?id=Me.TextBoxLON.Text&ud=Me.TextBoxLAT.Text ???

Riguardo all'articolo che mi hai linkato mi sembra che tutto il codice sia in JavaScript
Come fare per inserirlo in ambiente VB NET??

Grazie ancora.

alexmed

Gianni77 Profilo | Junior Member

>Io devo passare il contenuto delle due textBox a questa riga
>>map.LoadMap(new VELatLong(47.6, -122.33), 10 ,'h' ,false);
>Sostituendo il 47.6 ed il -122.33

Ma questo map.LoadMap .... dove si trova??? Penso di non aver capito cosa vuoi fare... Stiamo parlando di un'applicazione winform che ha al suo interno un browser che apre una normale pagina html oppure di un'applicazione in asp.net? Se è il secondo caso non posso esserti d'aiuto

>Quello che mi chiedo è questo
>Se io sostituisco i valori con due "variabili" (ammesso che così
>facendo lo siano)
>map.LoadMap(new VELatLong('LON', 'LAT'), 10 ,'h' ,false);
>Come faccio a impostare i valori con www.....html?id=Me.TextBoxLON.Text&ud=Me.TextBoxLAT.Text
>???

Scusa non ti basta fare: webbrowser.navigate("www.....html?id=" & Me.TextBoxLON.Text & "ud=" & Me.TextBoxLAT.Text) ?

>
>Riguardo all'articolo che mi hai linkato mi sembra che tutto
>il codice sia in JavaScript
>Come fare per inserirlo in ambiente VB NET??

Il codice in Javascript va inserito nella pagina HTML che intendi caricare... A meno che la pagina html in questione non è di tua proprietà, per cui non puoi metterci mano...

------------EDIT---------------------

Aspe penso di aver capito... Ho avuto un momento di distrazione... In effetti la tua pagina html andrebbe riscritta col codice da me postato in maniera da fondere la funzione che ti ho fornito io che ricava le variabili passate nella querystring con la tua funzione che carica la mappa...
Se mi passi qualcosa su cui lavorare, potrei provare a fare qualcosa, ma non ti assicuro niente di che, il javascript l'ho studiato un pochetto ma non ci so fare grandi cose.

alexmed Profilo | Guru

Ciao Gianni e grazie
Dunque
Si, stiamo parlando di un'applicazione WinForm, in cui ci sono le due TextBox che contengono Latitudine e Longitudine ed un WebBrowser.
Una volta impostati i campi TextBox alla pressione del Button vorrei caricare la mappa nel WebBroswer.
Per ora ho trovato una soluzione abbastanza buona utilizzando WebBrowser.DocumentText

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Questo mi consente di non avere file HTML sparsi qua e là e sembra funzionare bene a patto di non cliccare nuovamente prima che finisca di caricare tutta la pagina. Ma non è un gran problema in quanto basta inserire nell'evento click un Button.Enable = False all'inizio del codice sopra per poi riattivarlo nell'evento WebBrowser1_DocumentCompleted.

Questo è il riferimento per il codice da inserire nella pagina HTML
>http://dev.live.com/virtualearth/sdk/

Tra l'altro ho fatto delle prove anche con Google Maps, ma sembra che una funzione JavaScript controlli la compatibilità del Browser e quindi mi viene fuori un messaggio di errore.
>http://code.google.com/intl/it/apis/maps/documentation/introduction.html

Cosa ne pensi?
Ciao

alexmed

Gianni77 Profilo | Junior Member

>Per ora ho trovato una soluzione abbastanza buona utilizzando
>WebBrowser.DocumentText
>Questo mi consente di non avere file HTML sparsi qua e là e sembra
>funzionare bene a patto di non cliccare nuovamente prima che
>finisca di caricare tutta la pagina. Ma non è un gran problema
>in quanto basta inserire nell'evento click un Button.Enable =
>False all'inizio del codice sopra per poi riattivarlo nell'evento
>WebBrowser1_DocumentCompleted.

Ottimo direi, per me è un'ottima soluzione davvero, tanto più che mi stai insegnando qualcosa di nuovo :)

>Questo è il riferimento per il codice da inserire nella pagina
>HTML
>>http://dev.live.com/virtualearth/sdk/

Mannaggia, quando clicco su source code mi appare una pagina bianca.... uff!!

>Tra l'altro ho fatto delle prove anche con Google Maps, ma sembra
>che una funzione JavaScript controlli la compatibilità del Browser
>e quindi mi viene fuori un messaggio di errore.
>>http://code.google.com/intl/it/apis/maps/documentation/introduction.html

Questa pagina di esempio qui, si può modificare con quella funzione che recupera la querystring, in maniera che passi alla funzione javascript i parametri, il controllo del browser si può pure bypassare. Farò qualche prova con questa pagina di esempio qui e ti farò sapere, ora devo andare a lavoro e torno stanotte.

>Cosa ne pensi?

La soluzione che hai adottato col documenttext per me è ottima, anch'io cerco di avere meno files sparsi per quanto possibile. Il vantaggio di avere una pagina html separata può derivare dal fatto di essere più flessibile (es: distribuisci la tua applicazione compilata, ma l'utente può modificare la pagina html per adattarla ai sui gusti usando sfondi, fonts e fogli di stile diversi), ma per un'applicazione base a mio avviso è una buona soluzione.

Faccio qualche prova con la pagina html separata alla quale passerai i parametri tramite querystring. Spero di riuscire. Appena riesco (o appena desisto perchè non riesco) posto qui il codice.

alexmed Profilo | Guru

Ok
Allora aspetto, senza fretta, il codice.
Ciao

alexmed

Gianni77 Profilo | Junior Member

Ok AlexMed, ce l'ho fatta :)
Ti illustro la mia soluzione alternativa per usare files html a parte con parametri da passare.

Hai il tuo form, dal quale ho previsto anche l'impostazione di larghezza ed altezza della mappa
(l'ho fatto stesso nella sub, ma tu puoi metterci pure due textbox o altro da dove prelevare le dimensioni), ed eventualmente anche tramite quale servizio scaricare la mappa (google map o mapdev).

La condizione che verifica quale mappa scegliere la imposti tu (io ti suggerisco come esempio: di default la mappa di google, eventualmente il servizio non fosse disponibile, allora la mappa di mapdev. Oppure puoi mettere dei radiobutton per scegliere quale mappa visualizzare).

Dal form imposti latitudine e longitudine, premi il tasto, il webbrowser carica la mappa scelta passandogli la querystring. Supponendo che il file della mappa si chiami map_google.html, al webbrowser passerai pertanto una stringa del tipo:

map_google.html?LA=valore_latitudine&LO=valore_longitudine&W=larghezza_mappa&H=altezza_mappa

gli ultimi due parametri W e H li puoi anche omettere, perchè da Javascript ho impostato 400 come valore di default.

Per recuperare da html i parametri passati con la QueryString utilizzerai una funzione JavaScript, che per comodità ho predisposto in un file a parte in maniera che possa essere caricato da entrambe le pagine senza riscrivere lo stesso codice in tutte e due le pagine.

Crei un file di testo, chiamandolo getQSParam.js e dentro ci metti il codice che segue
(te l'ho commentato abbastanza per farti capire, come vedrai la sintassi di VB.NET non si discosta molto da quella usata da JavaScript):

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Crei quindi le due pagine HTML che chiamerai ad esempio:

map_google.html

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e map_mapdev.html

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Questi 3 files (i due html e il js) li metti nella stessa cartella della tua applicazione.

Leggiti i commenti nelle pagine per capire cosa succede. Riguardo alla mappa di google devi procurarti un'apikey per poterla utilizzare, quella del mio file è quella li fornita come esempio e non si dovrebbe usare. Purtroppo la mappa di Google mi da degli errori e dopo 3 volte che ho utilizzato quell'api key di test, non posso piu visualizzare niente. La mappa di MapDev invece non mi da nessun problema e mi funziona perfettamente.

Modifichi quindi la tua sub btnHTML.Click in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Ti ho impostato il body delle pagine html in maniera tale che sia senza bordi, per cui la mappa la potrai visualizzare senza spazi bianchi intorno nel controllo webbrowser. Ti suggerisco di far impostare larghezza ed altezza della mappa in base alle dimensioni della finestra webbrowser. In questo modo tutto il codice è molto più flessibile, puoi utilizzare tutti i servizi di mappe che ti pare e personalizzarne ogni aspetto concentrandoti soltanto sul file che ti interessa.
Se non vuoi far apparire il bordino nero intorno alla mappa devi agire sullo stile del div della mappa nelle pagine html:

border:1px #000000 solid;

impostandolo a:

border:0px;

Spero ti piaccia. Fammi sapere.

Gianni77 Profilo | Junior Member

Qui:
http://www.pacem.it/CMerighi/Posts/41,it-IT/Converti_Decimali_in_Gradi_e_Viceversa_con_.Net.aspx
c'è anche un'utile struttura per convertire i gradi da decimale a sessagesimale e viceversa. Potresti implementarlo nel programma in maniera tale che le coordinate si possano inserire sia in un modo che nell'altro, ottenendo un software ancora piu flessibile.

Gianni77 Profilo | Junior Member

Giusto per farsi 4 risate, un po O.T. ma sempre in tema di coordinate....
Guarda qui (copia e incolla il link completo, perchè qui il forum si incastra sui link con le virgole dentro):
http://maps.google.it/maps?hl=it&ie=UTF8&ll=45.910608,13.507551&spn=0.002557,0.004978&t=h&z=18

hahahaha c'è qualcuno che davvero non sa come passare il tempo

alexmed Profilo | Guru

Ciao Gianni
Innanzi tutto GRAZIE!
L'approccio mi piace, soprattutto per la possibilità di scegliere la mappa anche se la "stessa cosa" sarebbe possibile con il mio sistema.
Si tratta di scegliere se appoggiarsi a dei file esterni oppure integrarli nel codice.
Appoggiarsi a file esterni significa avere la possibilità di implementare/personalizzare le mappe senza dover riscrivere tutto il programma.
Dall'altra parte significa non dare la possibilità all'utente di fare pasticci.

Tornando al codice invece ti sottolineo 2 cosette:
La prima è che con Google mi dà un'errore (vedi img allegata)

448x288 28Kb

Presumo sia legato in qualche modo al discorso della key
Inoltre mi piacerebbe visualizzare il pannello per scegliere se visualizzare la Mappa - Satellite o Terreno.
Il vantaggio di Google sicuramente sono le img da satellite più aggiornate (W la Foca ) ed una risoluzione maggiore.

Per quanto riguarda invece la conversione delle coordinate non ho la necessità di appoggiarmi a quella funzione che mi hai passato (grazie comunque) perchè provengono da un db nel quale vengono inserite (qui faccio il controllo su due MaskedTextBox) nel formato gradi primi secondi, lette da un rilevatore GPS.

Ti ringrazio nuovamente per la disponibilità.
Ciao

alexmed
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5