摘要:為了使DropDownList能夠動(dòng)態(tài)顯示多列數(shù)據(jù),需要通過(guò)三個(gè)步驟:一是通過(guò)語(yǔ)句讀取相關(guān)列數(shù)據(jù),二是通過(guò)語(yǔ)句合成各列定長(zhǎng)的多列項(xiàng),三是為DropDownList設(shè)置特定的字體字號(hào)。
關(guān)鍵詞:ASP.NET;DropDownList;動(dòng)態(tài)顯示;多列數(shù)據(jù)
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2009)05-1126-02
Perfect Solution for Dynamic Multi-Field Data List in Asp.Net DropdownList Control
ZHANG Geng-lu, CHEN Yue-qiang, ZHANG Jia-qi, LI Yin-suo
(Management Department, North Coal Medical University, Tangshan 063000, China)
Abstract: In order to List Dynamic Multi-Field Data in DropdownList Control, Three steps should to make. First: Read the specified column data, using C# language; Second: Made each column data fixed size and joined them together into DropdownList control, also using C# language; At last, Set special font name and size for it.
Key words: ASP.NET; DropDownList; Dynamic List; Multi-Field Data
1 引言
一般情況下,DropDownList/ListBox僅顯示一列數(shù)據(jù)。但在某些特殊場(chǎng)合,如果一個(gè)選項(xiàng)能夠同時(shí)顯示若干列相關(guān)數(shù)據(jù),則會(huì)使數(shù)據(jù)更直觀、選擇更方便、能更好的滿足用戶的使用需要。
以圖1為例,這是一個(gè)本科生畢業(yè)(設(shè)計(jì))論文選題頁(yè)面。在此頁(yè)面中,有三個(gè)DropDownList控件,它們可以動(dòng)態(tài)的顯示多列數(shù)據(jù)。通過(guò)多列相關(guān)數(shù)據(jù)的同時(shí)顯示,學(xué)生在做出選擇前,可以動(dòng)態(tài)的了解到某一選題當(dāng)前已被其它同學(xué)選擇的情況,從而更合理的進(jìn)行“預(yù)選”?“終選”,較好的避免了學(xué)生選題的“扎堆”現(xiàn)象。
在桌面程序設(shè)計(jì)語(yǔ)言中,PowerBuilder通過(guò)DataWindow控件實(shí)現(xiàn)了此種功能,但目前常用的網(wǎng)頁(yè)設(shè)計(jì)語(yǔ)言中,尚未發(fā)現(xiàn)可供使用的此類控件??梢酝ㄟ^(guò)一個(gè)DropDownList再配合一個(gè)表格類控件實(shí)現(xiàn)和選項(xiàng)相關(guān)的多項(xiàng)信息的同時(shí)顯示,雖然這樣可以“曲線救國(guó)”,但應(yīng)用效果卻會(huì)大打折扣。
因此,在動(dòng)態(tài)網(wǎng)頁(yè)設(shè)計(jì)時(shí),研究如何使DropDownList中完美實(shí)現(xiàn)動(dòng)態(tài)顯示多列數(shù)據(jù)很有必要。本文以圖1所示網(wǎng)頁(yè)為例,介紹在ASP.NET的DropDownList中完美實(shí)現(xiàn)動(dòng)態(tài)顯示多列數(shù)據(jù)的方法。
2 數(shù)據(jù)準(zhǔn)備
本例程序?yàn)橐粋€(gè)學(xué)生選題網(wǎng)頁(yè),在此網(wǎng)頁(yè)中,列出了所有指導(dǎo)教師的所有研究方向,供學(xué)生選擇,所有學(xué)生填寫志愿完畢,教師才可以根據(jù)學(xué)生選題情況,確定要指導(dǎo)的學(xué)生。類似的例子有于高考網(wǎng)上填寫志愿、網(wǎng)上投票等。
圖2列出了三個(gè)與本網(wǎng)頁(yè)相關(guān)的數(shù)據(jù)表:題目表用于存儲(chǔ)所有教師的所有選題,選題表用于存儲(chǔ)所有學(xué)生的選題結(jié)果,每人限選三個(gè),教師表用于存儲(chǔ)所有教師的相關(guān)情況。
在顯示選題數(shù)據(jù)前,首先需要通過(guò)SQL語(yǔ)句從三個(gè)數(shù)據(jù)表中生成相關(guān)數(shù)據(jù),具體的SQL語(yǔ)句比較復(fù)雜,也是編寫本網(wǎng)頁(yè)的關(guān)鍵語(yǔ)句之一,故在此給出,以供參考。
SELECT 導(dǎo)師姓名, 題目, 要求,
SUM(IIF(志愿號(hào) = 1, 人數(shù), 0)) AS 第一志愿人數(shù),
SUM(IIF(志愿號(hào) = 2, 人數(shù), 0)) AS 第二志愿人數(shù),
SUM(IIF(志愿號(hào) = 3, 人數(shù), 0)) AS 第三志愿人數(shù)
FROM (SELECT 題目表.編號(hào), 教師表.姓名 AS 導(dǎo)師姓名, 題目表.題目, 題目表.要求, 選題表.志愿號(hào), COUNT(*) AS 人數(shù)
FROM ((題目表 LEFT OUTER JOIN 教師表 ON 題目表.導(dǎo)師編號(hào) = 教師表.編號(hào))
LEFT OUTER JOIN 選題表 ON 題目表.編號(hào) = 選題表.題目號(hào))
GROUP BY 題目表.編號(hào), 教師表.姓名, 題目表.題目, 題目表.要求, 選題表.志愿號(hào)) T GROUP BY 編號(hào), 導(dǎo)師姓名, 題目, 要求
ORDER BY 導(dǎo)師姓名, 題目
3 數(shù)據(jù)讀取方法
通過(guò)互聯(lián)網(wǎng)搜索,對(duì)DropDownList中實(shí)現(xiàn)顯示多列數(shù)據(jù)的解決方案大致有兩種,第一方法是通過(guò)修改上面的SQL語(yǔ)句,將DropDownList要顯示的各列合成一列,然后令DropDownList綁定到生成表的指定列中。通過(guò)實(shí)驗(yàn),證明這種方法在ASP.Net中是不可取的,通過(guò)圖3所示的結(jié)果可知,DropDownList會(huì)將字段中的所有英文空格舍棄,這會(huì)導(dǎo)致列出的結(jié)果無(wú)法對(duì)齊、無(wú)法辯認(rèn)。
第二種方法是通過(guò)ASP.Net后臺(tái)程序,讀取上面的SQL語(yǔ)句生成的表中的各列數(shù)據(jù),合成DropDownList項(xiàng),然后添加到DropDownList中,其結(jié)果同樣為圖3所示。但這種方法和第一種方法不同,我們可以通過(guò)修改語(yǔ)句,為每列文字后補(bǔ)充空格,從而使各列對(duì)齊提供了可能,而第一種方法則無(wú)法介入。
本例借鑒第二種方法,采用通過(guò)AccessDataSource與GridView結(jié)合,通過(guò)可視操作,使要添加到DropDownList中的數(shù)據(jù)直接填入GridView中(見(jiàn)圖4),然后設(shè)GridView的Visible屬性為False。再通過(guò)程序從GridView中讀取數(shù)據(jù)。這種改進(jìn)盡管損失了一些網(wǎng)頁(yè)反應(yīng)速度,但在較大程度上降低了程序編寫難度、提高了程序的可靠性和編寫效率。
通過(guò)這一改進(jìn),所需編寫的向DropDownList中添加數(shù)據(jù)的程序變得非常簡(jiǎn)單。
Protected void Page_Load(object sender, EventArgs e)
{if (!Page.IsPostBack)
{FillList(DropDownList1);
FillList(DropDownList2);
FillList(DropDownList3);
}
}
private void FillList(DropDownList myList)//向列表框中添加列表字符串/值
{
myList.Items.Clear(); //清空列表框中的列表值
myList.Items.Add(\". 無(wú) \");//添加一個(gè)空選列表字符串
myList.Items[0].Value = \"0\";//指定本列表項(xiàng)的值
for (int i = 0; i < GridView1.Rows.Count; i++)
{ //生成列表字符串s,列表字符串s由以下六列組成
string s =FixString( GridView1.Rows[i].Cells[0.Text, 5)//導(dǎo)師姓名
+ FixString( GridView1.Rows[i].Cells[1].Text,25)//題目
+ FixString( GridView1.Rows[i].Cells[2].Text,15)//要求
+ FixString( GridView1.Rows[i].Cells[3].Text, 4)//已將本列表項(xiàng)選為第1志愿人數(shù)
+ FixString( GridView1.Rows[i].Cells[4].Text, 4)//已將本列表項(xiàng)選為第2志愿人數(shù)
+ FixString( GridView1.Rows[i].Cells[5].Text, 4); //已將本列表項(xiàng)選為第3志愿人數(shù)
myList.Items.Add(s);//將字符串s添加到列表中
myList.Items[i + 1].Value = GridView1.Rows[i].Cells[0].Text; //指定本列表項(xiàng)的值
}
}
4 附加空格方法
如何為各列添加定長(zhǎng)空格,使得各列最終對(duì)齊顯示是本文的關(guān)鍵步驟。對(duì)于網(wǎng)頁(yè),只能添加中文空格,否則,即使添加再多英文空格,網(wǎng)頁(yè)控件和網(wǎng)頁(yè)元素都會(huì)將所有連續(xù)空格視為一個(gè)空格并合并為一個(gè)空格顯示。
通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),要為某列文字后添加適當(dāng)數(shù)量的中文空格,使其定長(zhǎng),需要的計(jì)算公式為:
整個(gè)列的規(guī)定長(zhǎng)度+(本列字符數(shù)×2-本列字節(jié)數(shù))/2
另外需要說(shuō)明的是:計(jì)算一個(gè)字符串字節(jié)數(shù)的方法為GetByteCount();為字符串右側(cè)添加字符(包括空格)的方法為PadRight(字符數(shù),字符);
最后,本公式中的除以2為整除。對(duì)于包含偶數(shù)個(gè)英文字符的字符串,正好補(bǔ)充n/2個(gè)中文空格,對(duì)于包含奇數(shù)個(gè)個(gè)英文字符的字符串,則需在補(bǔ)充(int)n/2個(gè)中文空格后,還需要再增加一個(gè)英文空格。以下是完整的附加空格程序。
private string FixString(string myText, int myLen)
{
int strLen = myText.Length;//字符串的字?jǐn)?shù)(1個(gè)漢字計(jì)為1個(gè)字)
int bitLen = System.Text.Encoding.Default.GetByteCount(myText); //字符串的字節(jié)數(shù)(1個(gè)漢字計(jì)為2個(gè)字節(jié))
if ((strLen * 2 - bitLen) % 2 == 0)//如果字符串中有偶數(shù)個(gè)英文字符,則
return myText.PadRight(myLen + (strLen * 2 - bitLen) / 2, '');
//返回一個(gè)添加了半數(shù)中文空格的字符串
else//否則
return myText.PadRight(myLen + (strLen * 2 - bitLen) / 2, '') + \" \";
//返回值時(shí),多添加一個(gè)英文空格
}
5 各列精確對(duì)齊方法
首先通過(guò)語(yǔ)句讀取相關(guān)列數(shù)據(jù)時(shí),只能用中文空格填充。在合成各列定長(zhǎng)的多列項(xiàng)操作時(shí),除了填充外,還要正確設(shè)置字體字號(hào)(字體必須是中文字體,即中文字庫(kù))。
除此之外,還有一個(gè)關(guān)鍵設(shè)置。即設(shè)置DropDownList的字體字號(hào),不能使用默認(rèn)值??梢詫⒆煮w設(shè)為“宋體”,字號(hào)值應(yīng)為9pt、10.75pt等,不能使用Small、Medium等既定字號(hào)。
6 結(jié)束語(yǔ)
在ASP.NET開(kāi)發(fā)過(guò)程中,使用DropDownList控件中的動(dòng)態(tài)數(shù)據(jù)綁定技術(shù),通過(guò)語(yǔ)句讀取數(shù)據(jù)的方法,增加了界面的可視化效果、更加人性化的處理??傊珹SP.NET為網(wǎng)絡(luò)的開(kāi)發(fā)提供了一個(gè)更成熟、更豐富的環(huán)境。
參考文獻(xiàn):
[1] Esposito D.ASP.NET2.0高級(jí)編程[M].施平安,譯.北京:清華大學(xué)出版社,2006.
[2] 李玉林,王巖.ASP.NET2.0網(wǎng)絡(luò)編程從入門到精通[M].北京:清華大學(xué)出版社,2006.
[3] 李萬(wàn)寶.ASP.NET技術(shù)詳解與應(yīng)用實(shí)例[M].北京:機(jī)械工業(yè)出版社,2005.