Reputation: 33087
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?
Upvotes: 31
Views: 60688
Reputation: 883
@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;
}
Upvotes: 0
Reputation: 946
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;
};
Upvotes: 1
Reputation: 381
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);
}
Upvotes: 1
Reputation: 21
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
Upvotes: 2
Reputation: 41
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;
}
}
}
Upvotes: 4
Reputation: 9664
What about setting the HtmlEncode
property to false
? To me, this is much simpler.
<asp:BoundField DataField="MyColumn" HtmlEncode="False" />
Upvotes: 51
Reputation: 21
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.
Upvotes: 2
Reputation: 41700
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.
Upvotes: 4
Reputation: 30041
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;
}
Upvotes: 47