zoukankan      html  css  js  c++  java
  • 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>

    效果图如下:

  • 相关阅读:
    四种读写方案IO流 (JAVA)
    如何保证ArrayList线程安全
    异常总结 (经典)
    JAVA反射机制
    移位运算符(JAVA)
    return和finally的执行顺序
    适配器模式(接口)
    2020年大厂Java面试题集锦,干货集锦,快来集合了!
    资深架构师解析springcloud分布式微服务的实现
    HTTP最全最新资料大全
  • 原文地址:https://www.cnblogs.com/StoneGarden/p/1458233.html
Copyright © 2011-2022 走看看