在asp.net下实现Option条目中填充前导空格的方法_实用技巧

在使用Web页面上的下拉列表框(SELECT element)显示数据列表时,有时我们会遇到有层次的数据条目。比如论坛中的子论坛和它的分类之间,以及一些具有包含关系的层次数据条目。使下拉列表框中,不同的level有一定的显示缩进将是非常友好的一种排版方式。

    如果在HTML编写状态下,或在ASP等脚本语言中,制作这样的下拉列表窗口非常容易。我们知道空格" "在Option标签的前后是会被brower的显示引擎自动忽略掉的,所以我们使用硬空格 就可以了,效果如下图:
   
<select>
    <option value="0">Level 00</option>
    <option value="1"> Level 01</option>
    <option value="2">  Level 02</option>
    <option value="3">   Level 03</option>
    <option value="4">    Level 04</option>
</select>

    如此简单就实现这个效果了,似乎没有什么可说的。可是当我们在ASP.NET中使用服务器控件ListBox或DropDownList的时候,要实现这个效果问题就来了。由于ListItem类的Text属性在输出为HTML代码的时候,会自动进行HtmlEncode转换,我们上面的示例会被输出为
   

<select>
    <option value="0">Level 00</option>
    <option value="1">&nbsp;Level 01</option>
    <option value="2">&nbsp;&nbsp;Level 02</option>
    <option value="3">&nbsp;&nbsp;&nbsp;Level 03</option>
    <option value="4">&nbsp;&nbsp;&nbsp;&nbsp;Level 04</option>
</select>

    真是让人郁闷,我第一次遇到这个问题时,使用了一个很ugly的方法来解决。就是重载控件,在Render的时候把"&nbsp;"变回为" "。大概就是:

class XxxDropDownList : DropDownList
{
    protected override void Render(HtmlTextWriter writer)
    {
        StringBuilder strb = new StringBuilder();
        StringWriter sw = new StringWriter(strb);
        HtmlTextWriter htw = new HtmlTextWriter(sw);
        base.Render(htw);
        strb.Replace("&nbsp;", " ");
        writer.Write(strb.ToString());
    }
}

    这个解决方案问题很多,效率是一回事,并且非常不完备。除了使用这种"野蛮"的修改Render结果的方法,还有一个也是ugly的方法是使用全角的Space,就是" "。不过在中文的系统中这种方法似乎也说的过去,可是在纯英文(Not support East-Asian language)的环境下,这样的Option条目就晕菜了,错误效果如下图:
   
    // 左图是在中文系统中,右图是在纯英文系统中

    那么怎么办呢?重载ListItem?! 不过此路不通,ListItem类是被sealed修饰的。后来我发现,可以使用 的"原始形式"来让DropListBox输出正确的HTML代码。什么是 的原始形式呢? 这个东西本来是在RFC 1866中定义的named entity,全称叫做:no-break space,CDATA格式为: 。我们把160作为字符放入ListItem的Text中,就能得到正确的HTML输出,效果和第一幅图中的HTML示例效果相同。服务器端代码为:

char nbsp = (char)0xA0;
for ( int i=0 ; i < 5 ; ++i )
{
    ddl3.Items.Add(new ListItem("Level 0".PadLeft(i+7, nbsp) + i, i.ToString()));
}

    生成的客户端代码为:

<select>
    <option value="0">Level 00</option>
    <option value="1"> Level 01</option>
    <option value="2">  Level 02</option>
    <option value="3">   Level 03</option>
    <option value="4">    Level 04</option>
</select>

时间: 2024-09-16 10:15:27

在asp.net下实现Option条目中填充前导空格的方法_实用技巧的相关文章

ASP.NET过滤HTML标签只保留换行与空格的方法_实用技巧

本文实例讲述了ASP.NET过滤HTML标签只保留换行与空格的方法.分享给大家供大家参考.具体分析如下: 自己从网上找了一个过滤HTML标签的方法,我也不知道谁的才是原创的,反正很多都一样.我把那方法复制下来,代码如下: 复制代码 代码如下: ///   <summary> ///   去除HTML标记 ///   </summary> ///   <param name="NoHTML">包括HTML的源码   </param> ///

asp.net下Request.QueryString取不到值的解决方法_实用技巧

今天做新的ppc weather服务器的时候竟然碰到QueryString取不到值的问题 查了下网上,应该是编码的问题,tq121用的是utf-8,而我希望用gb2132输入~ 因此,改一下~哈哈 打开web.config把    <!-- <globalization              requestEncoding="utf-8"              responseEncoding="utf-8"     />   改成 <

asp.net下检测远程URL是否存在的三种方法_实用技巧

复制代码 代码如下: private void Page_Load(object sender, System.EventArgs e) { string url1 = "http://s.jb51.net/"; string url2 = "yun_qi_img/logo.gif"; Response.Write("<li>方法1:"); Response.Write(url1 + " 存在:" + UrlExi

asp.net计算一串数字中每个数字出现的次数_实用技巧

接下来拆分这一串字符串,每个字符插入一个表变量中,最后使用GROUP BY进行分组. 复制代码 代码如下: CalNumOfChtInStr SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2012-02-23 -- Description: Calculate the num

asp.net GridView中使用RadioButton单选按钮的方法_实用技巧

本文实例讲述了asp.net GridView中使用RadioButton单选按钮的方法.分享给大家供大家参考,具体如下: 在GridView里做单选按钮,我用了三种方法 第一种方法:在GridView的模版列里加服务器端控件RadioButton,使用js控制单选 使用模版列里加RadioButton <script type="text/javascript"> function setRadio(nowRadio) { var myForm,objRadio; myF

asp.net获取ListView与gridview中当前行的行号_实用技巧

本文实例讲述了asp.net获取ListView与gridview中当前行的行号.分享给大家供大家参考,具体如下: aspx中,在gridview/ListView中,有一模板列,就叫linkbutton,想单击它时,获取它所在行的索引值 ListView中: 第一种: <ItemTemplate> <tr> <td> <asp:LinkButton runat="server" ID="btnSelected" Text=

asp.net实现在XmlTextWriter中写入一个CDATA的方法_实用技巧

本文实例讲述了asp.net实现在XmlTextWriter中写入一个CDATA的方法.分享给大家供大家参考,具体如下: 在CDATA可以用来写出像<br> ,<SCRIPT>这个样的HTML标记或任何其他标记.您不能添加一个简单的写WriteElementString这些标签的功能.将字符<转换成>.下面的例子给出了使用WriteElementString来写入一个cdata区域. 首先添加引用 using System.Xml 程序中这样来写 void page_l

asp.net实现word文档在线预览功能的方法_实用技巧

本文实例讲述了asp.net实现word文档在线预览功能的方法.分享给大家供大家参考.具体实现方法如下: 实现方式:office文档转html,再在浏览器里面在线浏览 1.首先引入com组件中office库,然后在程序集扩展中引入word的dll 2.将Microsoft.Office.Interop.Word的嵌入互操作类型设置为 false,如图 3.主要代码: 复制代码 代码如下: using System; using System.Collections.Generic; using

asp.net实现导出DataTable数据到Word或者Excel的方法_实用技巧

本文实例讲述了asp.net实现导出DataTable数据到Word或者Excel的方法.分享给大家供大家参考,具体如下: /// <summary>< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" /> /// 导出DataTable数据到Word或者Excel /// </summary> /// <param name=&q