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 "àèìòù 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.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Un po' di benchmark tra Linq, Entity Framework e Nhibernate, il 12 ottobre 2008 alle 14:46
- UrlRewriting con trabocchetti vari, l'11 dicembre 2007 alle 21:00
- Windows Forms - DataGridView e validazione, il 23 settembre 2007 alle 20:08
- ControlParameter e masterpage... bug?, il 23 dicembre 2006 alle 15:58
- Se Visual Studio 2005 non accetta più la tastiera, il 16 dicembre 2006 alle 20:45
- Service Pack 1 di Visual Studio 2005, il 16 dicembre 2006 alle 20:35