GridView中的C#HTML标记

时间:2010-04-14 16:27:24

标签: c# asp.net sql html gridview

我有一个用C#编写的SharePoint Web部件,用于根据用户选择显示SQL Server数据。我使用DataReader提取数据,用它填充DataSet,并在GridView中将DataSet设置为DataSource并将该控件添加到我的页面:

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

这给了我一个简单的HTML表,其中包含一个声明的CSS类,就是它。我面临的唯一问题是数据字段中的换行符根本没有呈现。我只是得到一个文本块,忽略了数据库呈现为HTML时存在的中断。在单步执行代码时,我看到换行符以“\ r \ n”的形式作为文本进入。我尝试了一个正则表达式:

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;

虽然它确实检测并替换了换行符,但我只是得到没有换行符的文本“
”。在查看HTML源代码时,它会在我指定“
”的位置插入以下行:

&lt;br /&gt;

我还尝试将我的SQL查询更改为:

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

这显然会带来更多新的线条。我可以看到它们存在,因为如果我也插入正则表达式它们会受到影响,但不会创建换行符。我不知道如何更换这些,以及如何更换线条以实际破坏。

4 个答案:

答案 0 :(得分:14)

网格视图中的

禁用所需列中的HTML呈现

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

并在字段中将
作为您拥有的文本的新行

更新: 我理解的是新的线条没有显示在gridview中,然后你试图通过用<br />替换\ n来强制它,我同意你的意见。但是br标签转换成html实体的下一个问题。并且您没有在gridview中使用强定义的列。它是自动生成列。 如果是这样,你所有的步骤都是正确的,还有一件事要做

Prevent HTML encoding in auto-generated GridView columns

答案 1 :(得分:0)

尝试将\ n更改为\ r \ n

<br />更改为<br>

答案 2 :(得分:0)

如果您有权访问生成的HTML,则可以执行以下操作:

  1. 使用c#regex将新行替换为“$ MYNEWLINE $”
  2. 在生成的HTML中,插入或插入以下内容:

    <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. 您还可以使用Jquery使上述浏览器更加友好。

答案 3 :(得分:0)

我有类似的问题渲染&#34;&amp;&#34;在数据中。解决方案是覆盖RowCreated以关闭生成的字段上的HtmlEncode。幸运的是,这正如我所希望的那样 - 它确实安全地处理了脚本标签。

myGridView.RowCreated += MyGridView_RowCreated;
myGridView.DataSource = gridData;
myGridView.DataBind();


private void MyGridView_RowCreated(object sender, GridViewRowEventArgs e)
{
   Foreach (TableCell cell in e.Row.Cells)
   {
      BoundField field = (BoundField)((DataControlFieldCell)cell).ContainingField;
      field.HtmlEncode = false;
   }
}