GridView 中的 C# HTML 标签

Posted

技术标签:

【中文标题】GridView 中的 C# HTML 标签【英文标题】:C# HTML tags inside GridView 【发布时间】:2011-02-08 00:15:34 【问题描述】:

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

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

这给了我一个带有声明的 CSS 类的简单 html 表格,仅此而已。我面临的唯一问题是数据字段中的换行符根本没有被呈现。我只是得到一个文本块,它在呈现为 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)

这显然会呈现更多的换行符。我可以看到它们存在,因为如果我也插入正则表达式它们会受到影响,但不要创建换行符。我不知道如何替换这些,以及用什么来让线条真正中断。

【问题讨论】:

【参考方案1】:

在网格视图中禁用所需列中的 HTML 呈现

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

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

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

Prevent HTML encoding in auto-generated GridView columns

【讨论】:

输出未使用绑定字段呈现。它只是一个 HTML 表格。 你是对的。我需要防止 GridView 对单元格文本中的 HTML 进行编码。但是,我确实找到了一种方法,它允许我使用基类并简单地查找我需要在 GridView 的 RowDataBound 事件上取消编码的特定单元格:justgeeks.blogspot.com/2009/01/…。虽然您的答案绝对是正确的答案,并且从长远来看是一种更彻底和更有效的方法,但如果没有太多要解码或有人只需要尽快完成,这将以一种快速而肮脏的方式工作。感谢您的帮助!【参考方案2】:

尝试将\n改为\r\n

&lt;br /&gt; 更改为&lt;br&gt;

【讨论】:

我也得到了同样的结果。 我认为这是因为您设置的是列数据而不是列 HTML。你可以这样做吗? newRow[ds3.Tables["Bobst Specs 3"].Columns[x]].AddControl(new LiteralControl(outputStr); 或者可能是 Controls.Add 而不是 AddControl。还有什么是newRow?【参考方案3】:

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

    使用 c# 正则表达式将新行替换为“$MYNEWLINE$”之类的内容

    在生成的 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>
    

    您还可以使用 Jquery 使上述内容更加跨浏览器友好。

【讨论】:

【参考方案4】:

我在数据中渲染“&”时遇到了类似的问题。解决方案是覆盖 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;
   

【讨论】:

以上是关于GridView 中的 C# HTML 标签的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTML 或 C# 更改 GridView 中的列名

GridView Webform c#中的行颜色更改

GridLayout和GridView的区别

在gridview中使用OnSelect Change打印到标签

如何在`GridView`中启用显示突出显示

C#中GridView设置滚动条的问题。