Come eseguire il rendering dell'HTML decodificato in un (cioè a < br >) nella cella GridView
Domanda
Sto associando un GridView a una query LINQ. Alcuni dei campi negli oggetti creati dall'istruzione LINQ sono stringhe e devono contenere nuove righe.
Apparentemente, GridView HTML codifica tutto in ogni cella, quindi non posso inserire un < br / > per creare una nuova linea all'interno di una cella.
Come faccio a dire a GridView di non codificare HTML il contenuto delle celle?
Forse dovrei usare un controllo diverso invece?
Soluzione
Puoi iscriverti all'evento RowDataBound? Se puoi, puoi eseguire:
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[0].Text);
e.Row.Cells[0].Text = decodedText;
}
Altri suggerimenti
Che dire dell'impostazione del false
? Per me, questo è molto più semplice.
<asp:BoundField DataField="MyColumn" HtmlEncode="False" />
Le nuove righe normali vengono conservate nell'output? In tal caso, puoi inviare le nuove righe e utilizzare lo stile css white-space: pre
, che conserverà le nuove righe, gli spazi e le schede.
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 0; i < e.Row.Cells.Count; i++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[i].Text);
e.Row.Cells[i].Text = decodedText;
}
}
}
La risposta di Booysen funziona ma solo per una colonna. Se si esegue un ciclo nell'evento RowDataBound, è possibile sostituire una variabile per lo [0] e fare questo lavoro su ogni colonna se lo si desidera. Ecco cosa ho fatto:
protected void gridCart_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 1; i < 4; i++)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decode = HttpUtility.HtmlDecode(e.Row.Cells[i].Text);
e.Row.Cells[i].Text = decode;
}
}
}
Il mio è stato avviato deliberatamente all'1 a causa dei miei dati, ma ovviamente funzionerà con qualsiasi cosa tu abbia bisogno.
Ho risolto il problema inserendo prima i dati nella mia tabella sql-server da una casella di testo multilinea usando
replace (txt = Replace(txt, vbCrLf,"<br />"))
Quindi ho usato la soluzione di Ray Booysen per restituirla alla mia griglia:
Protected Sub grdHist_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdHist.RowDataBound
Dim col1 As String = HttpUtility.HtmlDecode(e.Row.Cells(2).Text)
e.Row.Cells(2).Text = col1
End Sub
protected void gvHead_OnRowDataBound(object sender, GridViewRowEventArgs e) {
for (int i = 0; i < e.Row.Cells.Count; i++)
e.Row.Cells[i].Text = HttpUtility.HtmlDecode(e.Row.Cells[i].Text);
}
Devi associare l'evento DataBoundGrid e modificare il rendering per le colonne in cui desideri eseguire il rendering del codice HTML.
public event EventHandler DataBoundGrid {
add { ctlOverviewGridView.DataBound += value; }
remove { ctlOverviewGridView.DataBound -= value; }
}
ctlOverview.DataBoundGrid += (sender, args) => {
((sender as ASPxGridView).Columns["YourColumnName"] as GridViewDataTextColumn).PropertiesTextEdit.EncodeHtml = false;
};
@Ray Booysen
sono corrette ma in alcuni casi HtmlDecode () non è in grado di gestire il problema. puoi usare UrlDecode () invece di HtmlDecode ().
ecco un'altra soluzione:
if (e.Row.RowType == DataControlRowType.DataRow)
{
string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text);
e.Row.Cells[0].Text = decodedText;
}