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 源代码时,它会在我指定“”的位置插入以下行:
<br />
我还尝试将我的 SQL 查询更改为以下内容:
SELECT REPLACE (fldCustomerName, '. ', '.' + @NewLineChar)
这显然会呈现更多的换行符。我可以看到它们存在,因为如果我也插入正则表达式它们会受到影响,但不要创建换行符。我不知道如何替换这些,以及用什么来让线条真正中断。
【问题讨论】:
【参考方案1】:在网格视图中禁用所需列中的 HTML 呈现
<asp:BoundField DataField="MyColumn" HtmlEncode="false" />
并在字段中将 作为您拥有的文本的新行
更新:
我的理解是gridview中没有显示新行,然后你试图通过用<br />
替换\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
将<br />
更改为<br>
【讨论】:
我也得到了同样的结果。 我认为这是因为您设置的是列数据而不是列 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 标签的主要内容,如果未能解决你的问题,请参考以下文章