How to render decoded HTML in a (i.e. a <br>) in GridView cell

0 votes
asked Jan 10, 2009 by core

I'm binding a GridView to an LINQ query. Some of the fields in the objects created by the LINQ statement are strings, and need to contain new lines.

Apparently, GridView HTML-encodes everything in each cell, so I can't insert a <br /> to create a new line within a cell.

How do I tell GridView not to HTML encode the contents of cells?

Maybe I should use a different control instead?

9 Answers

0 votes
answered Jan 10, 2009 by ray-booysen

Can you subscribe to the RowDataBound event? If you can, you can run:

if (e.Row.RowType == DataControlRowType.DataRow)
{
  string decodedText = HttpUtility.HtmlDecode(e.Row.Cells[0].Text);
  e.Row.Cells[0].Text = decodedText;
}
0 votes
answered Jan 10, 2009 by configurator

Are normal newlines preserved in output? If so, you can send the newlines, and use the css style white-space: pre, which would preserve newlines, spaces and tabs.

0 votes
answered Jan 2, 2010 by john

Booysen's answer works but only for one column. If you run a loop in the RowDataBound event, you can substitute a variable for the [0] and have this work on each column if you want. Here's what I did:

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;
        }
    }
}

Mine is deliberately started at 1 because of my data, but obviously it will work with whatever you need.

0 votes
answered Jan 2, 2010 by aaron-daniels

What about setting the HtmlEncode property to false? To me, this is much simpler.

<asp:BoundField DataField="MyColumn" HtmlEncode="False" />
0 votes
answered Jan 18, 2010 by daamonturne

I got around this by first inserting the data into my sql-server table from a multi-line textbox using

   replace (txt = Replace(txt, vbCrLf,"<br />"))

Then I used Ray Booysen's solution to return it to my gridview:

 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
0 votes
answered Jan 24, 2014 by developer
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;
        }
    }
}
0 votes
answered Jan 26, 2015 by hank-brandenburg
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);
}
0 votes
answered Jan 18, 2016 by szuuuken

You have to bind to the the DataBoundGrid event and change the Rendering for the columns you want to render HTML code.

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;
};
0 votes
answered Sep 15, 2017 by reza-paidar

@Ray Booysen answers is right but in some cases HtmlDecode() can't handle your problem. you can use UrlDecode() instead of HtmlDecode().
here is another solution:

if (e.Row.RowType == DataControlRowType.DataRow)
{
  string decodedText = HttpUtility.UrlDecode(e.Row.Cells[0].Text);
  e.Row.Cells[0].Text = decodedText;
}
Welcome to Q&A, where you can ask questions and receive answers from other members of the community.
Website Online Counter

...