40 messaggi dal 20 novembre 2012
Buon giorno a tutti, ho il seguente problema: Ho un db MySql che contiene dei dati, ho realizzato un'applicazione Desktop con Visual Studio 2010, leggo i dati e li metto in un DataGridView, poi selezionando una riga sposto alcuni dati nei TextBox per una successiva modifica. Se ci sono dei dati accentati vengono visti in modo corretto e quando vengono messi nei TextBox i dati risultano corretti (es. "Bar Mc Cafe'" (e accentata) viene visualizzato e spostato cosi come e' scritto).
-
Successivamente ho realizzato un'applicazione WEB con Visual Studio 2013 Web, leggo gli stessi dati e li metto in un GridView, poi selezionando la riga sposto i dati nei TextBox, qui si presenta il problema, cioe' la cella del GridView che contiene caratteri accentati (vengono visti in modo corretto) contiene a questo punto NON la scritta cosi' come appare a video (Mc Cafe', e accentata ) ma la sua trascodifica (Mc Caf&#232).
-
Ho verificato che l'encoding utilizzato sia lo stesso in entrambe le applicazioni ("utf-8"), ho provato a sostituirlo con "iso-8859-1, ma il risultato e' lo stesso, cioe' nella cella avviene la trascodifica.
-
Avete qualche idea per risolvere il problema? Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
penso che utf-8 e iso-8859-1 in questo caso non c'entrino perché la sequenza è non è propria di queste codifiche di caratteri.

Si tratta invece di una HTML entity, ovvero di una notazione alternativa che si usa in HTML per rappresentare determinati caratteri speciali o riservati.
L'utente che visualizza la pagina nel suo browser, non riesce a rendersi conto se il carattere sia stato rappresentato come HTML entity o no. Ne vedi un esempio qui: le due lettere è appaiono uguali.
http://jsfiddle.net/kNFDG/3/

In ASP.NET, la trasformazione da carattere ad HTML entity avviene con metodi tipo HtmlEncode.

Se tu riesci a vedere la sequenza è a video, è perché il metodo HtmlEncode è stato applicato due volte sulla stessa stringa. Ecco il risultato, vedi che il carattere & è stato convertito esso stesso in &, la sua HTML Entity corrispondente.
http://jsfiddle.net/kNFDG/2/

In sintesi: devi identificare nel tuo codice i punti in cui chiami l'HtmlEncode. Potesti avere un codice tipo questo:
<%: Server.HtmlEncode("Mc Café") %>

I due punti equivalgono ad un ulteriore HtmlEncode.

ciao,
Moreno
Modificato da BrightSoul il 01 luglio 2014 21.18 -

Enjoy learning and just keep making
40 messaggi dal 20 novembre 2012
Scusa vorrei fare una precisazione, perche' potrei esser stato frainteso, e cioe': Nel GridView il valore si vede correttamente (Mc Cafe' (e accentata)) e' nel textBox (dopo il suo riempimento) che lo stesso valore appare trascodificato ("Mc Caf&#232").
-
In ogni caso ho controllato ma io un comando tipo "Server.HtmlEncode" non l'ho inserito.
-
Grazie e ciao.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,
mostra il codice che usi per visualizzare il testo nella textbox. Dato che stai usando una GridView, ti sei appoggiato ad un BoundField o ad un TemplateField?

robdevo ha scritto:

In ogni caso ho controllato ma io un comando tipo "Server.HtmlEncode" non l'ho inserito.

Ok, tuttavia vorrei convincerti del fatto che un html encoding di quella stringa deve pur essersi verificato da qualche parte, altrimenti il carattere è non avrebbe potuto essere convertito in &#232;

Sei assolutamente sicuro che la stringa Mc Caf&#232; non arrivi dal database? Vai ad aprire la tabella con un client MySql, verifica di nuovo se appare codificata o no.

ciao,
Moreno

Enjoy learning and just keep making
40 messaggi dal 20 novembre 2012
Ti posto il codice che mette nei TextBox i dati della riga selezionata nel GridView.
-
Protected Sub GrvDati_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GrvDati.SelectedIndexChanged
str = GrvDati.SelectedRow.Cells(2).Text
Call CambiaCharAcc(str)
TbxFornitore.Text = str
TbxDescri.Text = GrvDati.SelectedRow.Cells(3).Text
str = GrvDati.SelectedRow.Cells(4).Text
Call TogliDaPcp(str)
TbxNote.Text = str
LbxTipiPag.Text = GrvDati.SelectedRow.Cells(5).Text
TbxImpNetto.Text = GrvDati.SelectedRow.Cells(6).Text
GrvDati.SelectedRowStyle.BackColor = Drawing.Color.Orange
TbxData.Focus()
End Sub
-
Nella Sub CambiaCharAcc verifico se nella stringa passata esiste un insieme di tipo "&#nnn" (nnn= numero), se si rimetto il carattere accentato originale.
-
Contenuto riga GridView.
DatafornitoredescrizionenoteTipoPagNettoIvaAltroLordoSpeInc
Seleziona2014/06/30Bar Mc Cafè Sedriano2 colazioni (di cui 1 gratis)Contanti1,900,000,001,900,00

Contenuto TextBox.
Bar Mc Cafè (dopo inserimento Sub CambiaCharAcc) prima era "&#232".
Nel DB MySql i dati sono registrati in maniera corretta.
Ciao.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

robdevo ha scritto:

Nella Sub CambiaCharAcc verifico se nella stringa passata esiste un insieme di tipo "&#nnn" (nnn= numero), se si rimetto il carattere accentato originale.

Usa Server.HtmlDecode, sarà più semplice e affidabile.

Comunque, puoi farne a meno. Ecco spiegato l'arcano:

str = GrvDati.SelectedRow.Cells(2).Text

Qui vai a rileggere il contenuto della cella, e quindi subisci l'HtmlEncode che probabilmente viene operato dal campo della GridView.

Eviteresti il problema se leggessi il valore dalla proprietà DataItem della SelectedRow. Ecco un esempio su MSDN.
http://msdn.microsoft.com/it-it/library/system.web.ui.webcontrols.gridviewrow.dataitem(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-3
Lo rielaboro per adattarlo al tuo caso, prova così:
Dim rowView As DataRowView = CType(GrvDati.SelectedRow.DataItem, DataRowView)
' Recupera il valore usando il nome della colonna
Dim valore As String = rowView("NomeColonna").ToString()


ciao,
Moreno

Enjoy learning and just keep making
40 messaggi dal 20 novembre 2012
Ciao, ho fatto 2 prove:
-
La prima usando HtmlDecode (che non conoscevo) e funziona pefettamente, nel senso che la stringa viene portata nel textbox con il carattere accentato (come nel gridview).
-
La seconda usando il DataItem del SelectedRow, pero' non mi funziona, mi segnala l'errore: System.NullReferenceException, Ti posto il codice:
-
Protected Sub GrvDati_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GrvDati.SelectedIndexChanged
..
Dim rowView As DataRowView = CType(GrvDati.SelectedRow.DataItem, DataRowView)
TbxFornitore.Text = rowView("fornitore").ToString()

..
TbxDescri.Text = GrvDati.SelectedRow.Cells(3).Text
str = GrvDati.SelectedRow.Cells(4).Text
Call TogliDaPcp(str)
TbxNote.Text = str
LbxTipiPag.Text = GrvDati.SelectedRow.Cells(5).Text
TbxImpNetto.Text = GrvDati.SelectedRow.Cells(6).Text
GrvDati.SelectedRowStyle.BackColor = Drawing.Color.Orange
TbxData.Focus()
End Sub
-
Grazie.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

robdevo ha scritto:

La seconda usando il DataItem del SelectedRow, pero' non mi funziona, mi segnala l'errore: System.NullReferenceException,

Ok, vuol dire che il DataItem non è di tipo DataRowView, perché probabilmente la lista di oggetti che hai dato in pasto al GridView non era un DataTable. Di che tipo era il DataSource, una List(Of Fornitura)?

In questo caso prova così:
Dim rowView As Fornitura = CType(GrvDati.SelectedRow.DataItem, Fornitura)
TbxFornitore.Text = Fornitura.Fornitore

L'esatto tipo di oggetto e gli esatti nomi delle sue proprietà ti saranno sicuramente noti, perché li hai progettati tu. Nel dubbio, puoi anche mettere un breakpoint sul quella riga di codice e, quando il debugger interrompe l'esecuzione in quel punto, andare ad ispezionare il tipo e il valore contenuto in GrvDati.SelectedRow.DataItem.

ciao,
Moreno
Modificato da BrightSoul il 06 luglio 2014 10.04 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.