Encoding del GridView

di Andrea Zani, in .NET2,

Sono ancora vivo.

In un newsgroup è stato posto un interessante quesito riguardante il GridView. Una volta selezionata una riga con un button, e cercato di prendere il testo inserito in una cella di quella riga per inserirla in una textbox, il testo lì visualizzato, in caso di presenza di vocali accentate o altri 'strani' simboli, viene inserito come una sequenza escape. Il bello è che questa cosa con il classico DataGrid non avviene. Ad esempio, con questo codice:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<script runat="server">
    void Page_Load()
    {
        if (Page.IsPostBack) return;
        BindData();
    }
    void BindData()
    {
        DataTable dt = new DataTable();
        DataColumn dc;
        dc = new DataColumn("id", typeof(int));
        dc.AutoIncrement = true;
        dt.Columns.Add(dc);
        dc = new DataColumn("a1", typeof(string));
        dt.Columns.Add(dc);
        dc = new DataColumn("a2", typeof(string));
        dt.Columns.Add(dc);
        for (int i = 0; i < 10; i += 1)
        {
            DataRow dr = dt.NewRow();
            dr["a1"] = string.Format("aaz {0}", i);
            dr["a2"] = string.Format("àèìòù {0}", i);
            dt.Rows.Add(dr);
        }
        DataGrid1.DataSource = dt;
        DataGrid1.DataBind();
    }
    protected void DataGrid1_ItemCommand(object source, DataGridCommandEventArgs e)
    {
        DataGridItem row= DataGrid1.Items[e.Item.ItemIndex];
        messaggio.Text = row.Cells[3].Text;
    }
</script>
<html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>" >
<body>
    <form id="form1" runat="server">
    <div>
    <asp:DataGrid ID="DataGrid1" DataKeyField="id" runat="server" OnItemCommand="DataGrid1_ItemCommand" >
        <Columns>
            <asp:ButtonColumn Text="Edit"></asp:ButtonColumn>
        </Columns>
    </asp:DataGrid>
        Selezionata: <asp:TextBox id="messaggio" runat="server" />
    </div>
    </form>
</body>
</html>

Una volta richiesta questa pagina sarà visualizzato il classico DataGrid, con quattro colonne. Cliccando sul buttonlink nel textbox viene inserito il testo dell'ultima colonna, e le vocali accentate appaiono correttamente. Ma se lo stesso codice lo convertissimo per l'uso del GridView avremo la sorpresa:

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<script runat="server">
void Page_Load()
{
if (Page.IsPostBack) return;
BindData();
}
void BindData()
{
DataTable dt = new DataTable();
DataColumn dc;
dc = new DataColumn("id", typeof(int));
dc.AutoIncrement = true;
dt.Columns.Add(dc);
dc = new DataColumn("a1", typeof(string));
dt.Columns.Add(dc);
dc = new DataColumn("a2", typeof(string));
dt.Columns.Add(dc);
for (int i = 0; i < 10; i += 1)
{
DataRow dr = dt.NewRow();
dr["a1"] = string.Format("aaz {0}", i);
dr["a2"] = string.Format("àèìòù {0}", i);
dt.Rows.Add(dr);
}
GridView1.DataSource = dt;
GridView1.DataBind();
}
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
GridViewRow row = GridView1.Rows[Convert.ToInt32(e.CommandArgument)];
messaggio.Text = row.Cells[3].Text;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" DataKeyNames="id" OnRowCommand="GridView1_RowCommand">
<Columns>
<asp:ButtonField Text="Edit" />
</Columns>
</asp:GridView>
Selezionata: <asp:TextBox id="messaggio" runat="server" />
</div>
</form>
</body>
</html>

Cliccando sul linkbutton si visualizzerà, per esempio, la sequenza "&#224;&#232;&#236;&#242;&#249; 0".

Per risolvere è sufficiente utilizzare un banale trucco:

    protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        GridViewRow row = GridView1.Rows[Convert.ToInt32(e.CommandArgument)];
        messaggio.Text = HttpUtility.HtmlDecode(row.Cells[3].Text);
    }

La spiegazione di questo, se non erro, sta nella classe BoudColumn che, nel momento della creazione della cella, esegue l'HtmlEncode del testo da visualizzare. Più precisamente nella funzione "OnDataBindField" che richiama la funzione "FormatDataValue" che esegue effettivamente la codifica.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese