Asp.Net,GridView控件渲染空格
日前,做一个应用程序。aspx页面中有一个GridView控件,其数据源是DataTable。数据的某一列(假设为Col)的中间位置有N(N >= 0)个空格,形如"A BC"、"A BC",字符串中间空格数量不定。展示到IE浏览器中,用户使用鼠标选择该列的值,拷贝到其他文本框中做为查询条件。程序是B/S架构,其浏览器只能够是IE。
IE浏览器会非常智能化的将"A BC"、"A BC",统统显示为"A BC",即使A和B之间的空格有多个,也只是被浓缩为一个。问题出现了,因为用户需要选择渲染后的值作为搜索条件进行查找,显然,"A BC"并不等于"A BC"。
上网找了很多资料,绝大部分都是说,如果DataFormatString不生效,将HtmlEncode属性设置为false。只好自己动手了。
首先想到的是,HTML中,空格是使用" "表示,那么将Col列中的空格替换为" "是不是就解决问题了呢?结果,不正确。替换后,在Col中显示的是"A BC"。为什么这样子呢?应该是Asp.Net在渲染、拼装GridView的HTML代码时,将"A BC"做为一个字符串处理,而不是对" "进行了转义解释。查看了MSDN后,查看到BoundField类的HtmlEncode属性,在MSDN中这样介绍,
HtmlEncode,获取或设置一个值,该值指示在 BoundField 对象中显示字段值之前,是否对这些字段值进行 HTML 编码。
在结合遇到的情况,可以发现,之所以" "没有被渲染,其实就是因为在渲染时,已经将" "看作了字符串。
设置Col对应BoundField的HtmlEncode属性为false,再次运行程序,ok。成功。
根据大家的要求,放上样例代码和截屏,以便更直观得感受。
代码:
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected override void OnLoad(EventArgs e)
{
DataTable dtOrigin = PopulateTable();
DataTable dtDisableHtmlEncode = dtOrigin.Copy();
ChangeSpaceToNbsp(dtDisableHtmlEncode);
DataTable dtEnableHtmlEncode = dtOrigin.Copy();
GridView1.DataSource = dtDisableHtmlEncode;
GridView2.DataSource = dtEnableHtmlEncode;
GridView1.DataBind();
GridView2.DataBind();
base.OnLoad(e);
}
private void ChangeSpaceToNbsp(DataTable dt)
{
foreach (DataRow row in dt.Rows)
{
row["ExistSpace"] = row["ExistSpace"].ToString().Replace(" ", " ");
}
dt.AcceptChanges();
}
private static DataTable PopulateTable()
{
DataTable dt = BuildTable();
string demoStringHead = "A";
string demoStringFoot = "BC";
string spaceChar = " ";
for (int iIndex = 0; iIndex < 5; iIndex++)
{
spaceChar += " ";
DataRow row = dt.NewRow();
row["Id"] = iIndex;
row["ExistSpace"] = demoStringHead + spaceChar + demoStringFoot;
row["NoSpace"] = demoStringHead + demoStringFoot;
dt.Rows.Add(row);
}
dt.AcceptChanges();
return dt;
}
private static DataTable BuildTable()
{
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("Id", typeof(int)));
dt.Columns.Add(new DataColumn("ExistSpace", typeof(string)));
dt.Columns.Add(new DataColumn("NoSpace", typeof(string)));
return dt;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<span>使用了"HtmlEnCode=false"以及"&nbsp;"的效果</span>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" Width="433px">
<Columns>
<asp:BoundField DataField="Id" HeaderText="ID" />
<asp:BoundField DataField="ExistSpace" HeaderText="有空格" HtmlEncode="False">
<ItemStyle BackColor="#0066FF" Font-Underline="True" />
</asp:BoundField>
<asp:BoundField DataField="NoSpace" HeaderText="无空格" />
</Columns>
</asp:GridView>
</div>
<br />
<div>
<span>未使用的效果</span></div>
<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" Width="433px">
<Columns>
<asp:BoundField DataField="Id" HeaderText="ID" />
<asp:BoundField DataField="ExistSpace" HeaderText="有空格">
<ItemStyle BackColor="#0066FF" Font-Underline="True" />
</asp:BoundField>
<asp:BoundField DataField="NoSpace" HeaderText="无空格" />
</Columns>
</asp:GridView>
</form>
</body>
</html>
效果图如下: