在asp.net下實(shí)現(xiàn)Option條目中填充前導(dǎo)空格的方法
更新時(shí)間:2007年03月08日 00:00:00 作者:
在使用Web頁(yè)面上的下拉列表框(SELECT element)顯示數(shù)據(jù)列表時(shí),有時(shí)我們會(huì)遇到有層次的數(shù)據(jù)條目。比如論壇中的子論壇和它的分類(lèi)之間,以及一些具有包含關(guān)系的層次數(shù)據(jù)條目。使下拉列表框中,不同的level有一定的顯示縮進(jìn)將是非常友好的一種排版方式。
如果在HTML編寫(xiě)狀態(tài)下,或在ASP等腳本語(yǔ)言中,制作這樣的下拉列表窗口非常容易。我們知道空格" "在Option標(biāo)簽的前后是會(huì)被brower的顯示引擎自動(dòng)忽略掉的,所以我們使用硬空格 就可以了,效果如下圖:
<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>
如此簡(jiǎn)單就實(shí)現(xiàn)這個(gè)效果了,似乎沒(méi)有什么可說(shuō)的。可是當(dāng)我們?cè)贏SP.NET中使用服務(wù)器控件ListBox或DropDownList的時(shí)候,要實(shí)現(xiàn)這個(gè)效果問(wèn)題就來(lái)了
。由于ListItem類(lèi)的Text屬性在輸出為HTML代碼的時(shí)候,會(huì)自動(dòng)進(jìn)行HtmlEncode轉(zhuǎn)換,我們上面的示例會(huì)被輸出為
:

<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>
真是讓人郁悶,我第一次遇到這個(gè)問(wèn)題時(shí),使用了一個(gè)很ugly的方法來(lái)解決。就是重載控件,在Render的時(shí)候把"&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());
}
}
這個(gè)解決方案問(wèn)題很多,效率是一回事,并且非常不完備。除了使用這種"野蠻"的修改Render結(jié)果的方法,還有一個(gè)也是ugly的方法是使用全角的Space,就是" "。不過(guò)在中文的系統(tǒng)中這種方法似乎也說(shuō)的過(guò)去,可是在純英文(Not support East-Asian language)的環(huán)境下,這樣的Option條目就暈菜了,錯(cuò)誤效果如下圖:

// 左圖是在中文系統(tǒng)中,右圖是在純英文系統(tǒng)中
那么怎么辦呢?重載ListItem?! 不過(guò)此路不通,ListItem類(lèi)是被sealed修飾的
。后來(lái)我發(fā)現(xiàn),可以使用 的"原始形式"來(lái)讓DropListBox輸出正確的HTML代碼。什么是 的原始形式呢? 這個(gè)東西本來(lái)是在RFC 1866中定義的named entity,全稱(chēng)叫做:no-break space,CDATA格式為: 。我們把160作為字符放入ListItem的Text中,就能得到正確的HTML輸出,效果和第一幅圖中的HTML示例效果相同。服務(wù)器端代碼為:
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>
如果在HTML編寫(xiě)狀態(tài)下,或在ASP等腳本語(yǔ)言中,制作這樣的下拉列表窗口非常容易。我們知道空格" "在Option標(biāo)簽的前后是會(huì)被brower的顯示引擎自動(dòng)忽略掉的,所以我們使用硬空格 就可以了,效果如下圖:
<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>如此簡(jiǎn)單就實(shí)現(xiàn)這個(gè)效果了,似乎沒(méi)有什么可說(shuō)的。可是當(dāng)我們?cè)贏SP.NET中使用服務(wù)器控件ListBox或DropDownList的時(shí)候,要實(shí)現(xiàn)這個(gè)效果問(wèn)題就來(lái)了

<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>真是讓人郁悶,我第一次遇到這個(gè)問(wèn)題時(shí),使用了一個(gè)很ugly的方法來(lái)解決。就是重載控件,在Render的時(shí)候把"&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());
}
}這個(gè)解決方案問(wèn)題很多,效率是一回事,并且非常不完備。除了使用這種"野蠻"的修改Render結(jié)果的方法,還有一個(gè)也是ugly的方法是使用全角的Space,就是" "。不過(guò)在中文的系統(tǒng)中這種方法似乎也說(shuō)的過(guò)去,可是在純英文(Not support East-Asian language)的環(huán)境下,這樣的Option條目就暈菜了,錯(cuò)誤效果如下圖:

// 左圖是在中文系統(tǒng)中,右圖是在純英文系統(tǒng)中
那么怎么辦呢?重載ListItem?! 不過(guò)此路不通,ListItem類(lèi)是被sealed修飾的
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>相關(guān)文章
ASP.NET中上傳并讀取Excel文件數(shù)據(jù)示例
如何打開(kāi)Excel數(shù)據(jù)庫(kù)文件,想必有很多朋友都不清楚吧,下面通過(guò)一個(gè)簡(jiǎn)單的例子,實(shí)現(xiàn)讀取Excel數(shù)據(jù)文件2014-05-05
.Net中關(guān)于stirng轉(zhuǎn)System.Type的一種實(shí)現(xiàn)思路詳解
這篇文章主要給大家介紹了.Net中關(guān)于stirng轉(zhuǎn)System.Type的一種實(shí)現(xiàn)思路的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
.NET讀寫(xiě)Excel工具Spire.Xls使用 Excel文件的控制(2)
這篇文章主要為大家詳細(xì)介紹了.NET讀寫(xiě)Excel工具Spire.Xls使用,Excel文件的控制,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
asp.net Repeater控件的說(shuō)明及詳細(xì)介紹及使用方法
Repeater控件是Web 服務(wù)器控件中的一個(gè)容器控件,它使您可以從頁(yè)的任何可用數(shù)據(jù)中創(chuàng)建出自定義列表。2010-04-04
水晶報(bào)表asp.net的webform下基本用法實(shí)例
這篇文章主要介紹了水晶報(bào)表asp.net的webform下基本用法,實(shí)例講述了asp.net中水晶報(bào)表的創(chuàng)建與使用方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11
asp.net實(shí)現(xiàn)的計(jì)算網(wǎng)頁(yè)下載速度的代碼
剛看到有人給出asp.net實(shí)現(xiàn)的計(jì)算網(wǎng)頁(yè)下載速度的方法,本方法未經(jīng)本人測(cè)試,不知道能否可靠性如何。準(zhǔn)確來(lái)說(shuō),這只是個(gè)思路吧2013-03-03
.NET Core跨平臺(tái)執(zhí)行命令、腳本的方法詳細(xì)
這篇文章主要給大家介紹了關(guān)于.NET Core跨平臺(tái)執(zhí)行命令、腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05

