views:

512

answers:

3

I have a SharePoint web part that I wrote in C# which is used to display SQL Server data based on user selections. I pull the data with a DataReader, fill a DataSet with it, and set that DataSet as the DataSource in a GridView and add that control to my page:

GridView outputGrid = new GridView();
outputGrid.CssClass = "OutputGrid";
outputGrid.DataSource = flipped_ds1;
outputGrid.RowDataBound += outputGrid_RowDataBound;
outputGrid.DataBind();
Controls.Add(outputGrid);

This gives me a simple HTML table with a declared CSS class and that's about it. The only problem I'm facing is that line breaks in the data fields are not being rendered at all. I'm simply getting a block of text that ignores the breaks that are present in the database when it's rendered to HTML. In stepping through my code, I see that the newlines are coming in as text in the form of "\r\n". I tried a regex:

Regex rgx = new Regex("\r\n");
string inputStr = Convert.ToString(dr[x]);
string outputStr = rgx.Replace(inputStr, "<br />");
newRow[ds3.Tables["Bobst Specs 3"].Columns[x]] = outputStr;

While that does detect and replace the newlines, I merely get the text "
" with no line breaks. In viewing the HTML source, it is inserting the following line where I specify "
":

&lt;br /&gt;

I also tried changing my SQL query to something along the lines of:

SELECT REPLACE (fldCustomerName, '. ', '.' + @NewLineChar)

This apparently renders more newlines. I can see that they are present, because if I also insert the regex they are affected, but do not create line breaks. I'm not sure how to replace these, and what with, to get the lines to actually break.

A: 

Try changing \n to \r\n

Change <br /> to <br>

SLC
I get the same results with this as well.
Geo Ego
I think it's because you're setting the column data rather than the column HTML. can you do this instead?newRow[ds3.Tables["Bobst Specs 3"].Columns[x]].AddControl(new LiteralControl(outputStr);
SLC
Or possible it's Controls.Add instead of AddControl. Also what is newRow?
SLC
+2  A: 

in the grid view disable the HTML render in the wanted column

<asp:BoundField DataField="MyColumn" HtmlEncode="false" />

and in the field put
as new line for the text you have

UPDATE: what I understood is the new lines are not showing in the gridview, then you tried to force it by replacing \n with <br /> which I agree with you in it. but the next problem the br tag converted into html entity. and you are not using strongly defined columns in gridview. it is auto-generate columns. if that so, all your steps are right and one more thing to do

http://stackoverflow.com/questions/2168649/prevent-html-encoding-in-auto-generated-gridview-columns

Kronass
The output is not rendered with bound fields. It's just an HTML table.
Geo Ego
You're right. I needed to prevent the GridView from encoding the HTML in the cell text. However, I did find a way to do it that allows me to use the base class and simply look for the specific cells that I need to unencode on the GridView's RowDataBound event: http://justgeeks.blogspot.com/2009/01/how-to-use-hyperlinks-gridview-with.html. While your answer is most definitely the correct one and a much more thorough and efficient way to do it in the long run, this will work in a quick and dirty way if there isn't much to decode or someone just needs it done ASAP. Thanks for your help!
Geo Ego
A: 

If you have access to the generated HTML, you could do the following:

  1. Use c# regex to replace new lines with something like "$MYNEWLINE$"
  2. In the generated HTML, inject or insert the following:

    <script type="text/javascript">
        function changeNewLines(){
        var inner_html = document.getElementById('theIDofyourgeneratedtable').innerHTML;
        var new_inner_html = inner_html.replace('$MYNEWLINE$', '<BR/>');
        document.getElementById('theIDofyourgeneratedtable').innerHTML = new_inner_html;
        }
        window.onload = changeNewLines;
    </script>
    
  3. You could also use Jquery to make the above more cross-browser friendly.

Juan Tarquino