网格视图截断多个空格(在文本框中正常工作)

时间:2013-04-02 14:43:14

标签: c# asp.net html

我有一个gridview BoundField需要显示字符串中存在的值 - 不应用HTML格式化并保留其间的多个空格(就像文本框的行为一样)

我尝试了以下方法,但没有奏效。我们怎样才能让它像文本框一样工作?

enter image description here

MARKUP

<form id="form1" runat="server">
<asp:TextBox ID="Textbox1" runat="server" EnableViewState="false"></asp:TextBox>
<asp:TextBox ID="Textbox2" runat="server" EnableViewState="false"></asp:TextBox>
<asp:TextBox ID="Textbox3" runat="server" EnableViewState="false"></asp:TextBox>
<asp:TextBox ID="Textbox4" runat="server" EnableViewState="false"></asp:TextBox>

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="B" DataFormatString="<pre>{0}</pre>"
            HtmlEncode="true" ItemStyle-BackColor="Gray" />
        <asp:BoundField DataField="Name" HeaderText="D" HtmlEncode="true" ItemStyle-BackColor="Cyan" />
        <asp:BoundField DataField="Name" HeaderText="E" ItemStyle-BackColor="Orange" />
        <asp:BoundField DataField="Name" HeaderText="C" HtmlEncode="false" ItemStyle-BackColor="Teal" />
         <asp:BoundField DataField="Name" HeaderText="A" DataFormatString="<pre>{0}</pre>"
            HtmlEncode="false" ItemStyle-BackColor="Yellow" />

    </Columns>
</asp:GridView>
</form>

C#CODE

protected void Page_Load(object sender, EventArgs e)
{

    string selectedVal1 = "a    b";
    string selectedVal2 = "<br />";
    string selectedVal3 = "<script    1>";
    string selectedVal4 = "<script>";


    this.Textbox1.Text = selectedVal1;
    this.Textbox2.Text = selectedVal2;
    this.Textbox3.Text = selectedVal3;
    this.Textbox4.Text = selectedVal4;

    DataTable table = new DataTable();
    table.Columns.Add("Name", typeof(string));
    table.Rows.Add(selectedVal1);
    table.Rows.Add(selectedVal2);
    table.Rows.Add(selectedVal3);
    table.Rows.Add(selectedVal4);

    GridView2.DataSource = table;
    GridView2.DataBind();

}

HTML

<input name="Textbox1" type="text" value="a    b" id="Textbox1" />
<input name="Textbox2" type="text" value="&lt;br />" id="Textbox2" />
<input name="Textbox3" type="text" value="&lt;script    1>" id="Textbox3" />
<input name="Textbox4" type="text" value="&lt;script>" id="Textbox4" />

<div>
<table cellspacing="0" rules="all" border="1" id="GridView2" style="border-collapse:collapse;">
    <tr>
        <th scope="col">B</th><th scope="col">D</th><th scope="col">E</th><th scope="col">C</th><th scope="col">A</th>
    </tr><tr>
        <td style="background-color:Gray;">&lt;pre&gt;a    b&lt;/pre&gt;</td><td style="background-color:Cyan;">a    b</td><td style="background-color:Orange;">a    b</td><td style="background-color:Teal;">a    b</td><td style="background-color:Yellow;"><pre>a    b</pre></td>
    </tr><tr>
        <td style="background-color:Gray;">&lt;pre&gt;&lt;br /&gt;&lt;/pre&gt;</td><td style="background-color:Cyan;">&lt;br /&gt;</td><td style="background-color:Orange;">&lt;br /&gt;</td><td style="background-color:Teal;"><br /></td><td style="background-color:Yellow;"><pre><br /></pre></td>
    </tr><tr>
        <td style="background-color:Gray;">&lt;pre&gt;&lt;script    1&gt;&lt;/pre&gt;</td><td style="background-color:Cyan;">&lt;script    1&gt;</td><td style="background-color:Orange;">&lt;script    1&gt;</td><td style="background-color:Teal;"><script    1></td><td style="background-color:Yellow;"><pre><script    1></pre></td>
    </tr><tr>
        <td style="background-color:Gray;">&lt;pre&gt;&lt;script&gt;&lt;/pre&gt;</td><td style="background-color:Cyan;">&lt;script&gt;</td><td style="background-color:Orange;">&lt;script&gt;</td><td style="background-color:Teal;"><script></td><td style="background-color:Yellow;"><pre><script></pre></td>
    </tr>
</table>
 </div>

3 个答案:

答案 0 :(得分:1)

如果您想要值中的确切空格,那么您必须在设计视图中绑定Gridview上的字段...

尝试如下..

DataFormatString="<pre>{0}</pre>"  // - this formating displays the values with spaces

请注意,我们正在关闭BoundField中的HTML编码(HtmlEncode="False"),因为我们使用的是pre代码。

来自HTML pre Tag

  

pre元素中的文本以固定宽度字体(通常为Courier)显示,并保留空格和换行符。

来自BoundField.HtmlEncode Property

  

HTML编码字段值有助于防止显示跨站点脚本攻击和恶意内容。应尽可能启用此属性。

来自HttpServerUtility.HtmlEncode Method

  

如果文本字符串包含小于号(&lt;)或大于号(&gt;),则浏览器会将这些字符解释为HTML标记的左括号或右括号。当字符是HTML编码时,它们被转换为字符串&lt;和&gt;,这会导致浏览器正确显示小于号和大于号。

在设计视图中设置gridview,如下所示..

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="Name" HeaderText ="Name" DataFormatString="<pre>{0}</pre>" 
HtmlEncode="False" />
</Columns>
</asp:GridView>

在C#Code Behind中(这是我的例子......你可以自己申请......)

DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
table.Rows.Add( "Ab      Sdf");
GridView1.DataSource = table;
GridView1.DataBind();

,其输出如下......

GridView OutPut

答案 1 :(得分:0)

默认情况下,浏览器删除连续的空格,只留下1个HTML文本。如果您希望显示所有空格,则在网格视图中显示时,您需要将其替换为不间断的空格字符“&amp; nbsp”

答案 2 :(得分:0)

我在RowDataBound事件中使用了以下C#代码

e.Row.Cells[(int)logDescriptionIndex].Text = 
e.Row.Cells[(int)logDescriptionIndex].Text.Replace(" ", "&nbsp;");

请注意以下内容

  1. 请勿将其应用于标题行
  2. 不要将它应用于具有进一步格式化的表格单元格(例如日期格式),格式化时可以有空格
  3. 注意:以下是基于另一个网格视图;不适用于有问题的gridview。使用有问题的gridview所需的微小更改

    <强> CODE

        protected void SearchLogsGridRowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e != null)
            {
                if (e.Row.RowType == DataControlRowType.Header)
                {
                    if (logDescriptionIndex == null)
                    {
                        int index = 0;
                        foreach (TableCell cell in e.Row.Cells)
                        {
                            if (cell.Controls[0] != null)
                            {
                                if (String.Equals(((LinkButton)(cell.Controls[0])).Text.Trim(), UIConstants.LogDescriptionHeader))
                                {
                                    logDescriptionIndex = index;
                                }
                            }
                            index++;
                        }
                    }
                }
    
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    if (logDescriptionIndex != null)
                    {
                        //  Replace white spaces with HTML space.
                        //  This is to handle multiple white spaces between two characters
                        e.Row.Cells[(int)logDescriptionIndex].Text = e.Row.Cells[(int)logDescriptionIndex].Text.Replace(" ", "&nbsp;");
                    }
                }
            }
    
        }