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(" ", "&nbsp;");
        }
        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"以及"&amp;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>

效果图如下:

posted on 2009-05-16 12:37  石头居  阅读(2945)  评论(3编辑  收藏  举报