摘要:為了使DropDownList能夠動態顯示多列數據,需要通過三個步驟:一是通過語句讀取相關列數據,二是通過語句合成各列定長的多列項,三是為DropDownList設置特定的字體字號。
關鍵詞:ASP.NET;DropDownList;動態顯示;多列數據
中圖分類號:TP311 文獻標識碼:A 文章編號: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僅顯示一列數據。但在某些特殊場合,如果一個選項能夠同時顯示若干列相關數據,則會使數據更直觀、選擇更方便、能更好的滿足用戶的使用需要。
以圖1為例,這是一個本科生畢業(設計)論文選題頁面。在此頁面中,有三個DropDownList控件,它們可以動態的顯示多列數據。通過多列相關數據的同時顯示,學生在做出選擇前,可以動態的了解到某一選題當前已被其它同學選擇的情況,從而更合理的進行“預選”?“終選”,較好的避免了學生選題的“扎堆”現象。
在桌面程序設計語言中,PowerBuilder通過DataWindow控件實現了此種功能,但目前常用的網頁設計語言中,尚未發現可供使用的此類控件。可以通過一個DropDownList再配合一個表格類控件實現和選項相關的多項信息的同時顯示,雖然這樣可以“曲線救國”,但應用效果卻會大打折扣。
因此,在動態網頁設計時,研究如何使DropDownList中完美實現動態顯示多列數據很有必要。本文以圖1所示網頁為例,介紹在ASP.NET的DropDownList中完美實現動態顯示多列數據的方法。
2 數據準備
本例程序為一個學生選題網頁,在此網頁中,列出了所有指導教師的所有研究方向,供學生選擇,所有學生填寫志愿完畢,教師才可以根據學生選題情況,確定要指導的學生。類似的例子有于高考網上填寫志愿、網上投票等。
圖2列出了三個與本網頁相關的數據表:題目表用于存儲所有教師的所有選題,選題表用于存儲所有學生的選題結果,每人限選三個,教師表用于存儲所有教師的相關情況。
在顯示選題數據前,首先需要通過SQL語句從三個數據表中生成相關數據,具體的SQL語句比較復雜,也是編寫本網頁的關鍵語句之一,故在此給出,以供參考。
SELECT 導師姓名, 題目, 要求,
SUM(IIF(志愿號 = 1, 人數, 0)) AS 第一志愿人數,
SUM(IIF(志愿號 = 2, 人數, 0)) AS 第二志愿人數,
SUM(IIF(志愿號 = 3, 人數, 0)) AS 第三志愿人數
FROM (SELECT 題目表.編號, 教師表.姓名 AS 導師姓名, 題目表.題目, 題目表.要求, 選題表.志愿號, COUNT(*) AS 人數
FROM ((題目表 LEFT OUTER JOIN 教師表 ON 題目表.導師編號 = 教師表.編號)
LEFT OUTER JOIN 選題表 ON 題目表.編號 = 選題表.題目號)
GROUP BY 題目表.編號, 教師表.姓名, 題目表.題目, 題目表.要求, 選題表.志愿號) T GROUP BY 編號, 導師姓名, 題目, 要求
ORDER BY 導師姓名, 題目
3 數據讀取方法
通過互聯網搜索,對DropDownList中實現顯示多列數據的解決方案大致有兩種,第一方法是通過修改上面的SQL語句,將DropDownList要顯示的各列合成一列,然后令DropDownList綁定到生成表的指定列中。通過實驗,證明這種方法在ASP.Net中是不可取的,通過圖3所示的結果可知,DropDownList會將字段中的所有英文空格舍棄,這會導致列出的結果無法對齊、無法辯認。
第二種方法是通過ASP.Net后臺程序,讀取上面的SQL語句生成的表中的各列數據,合成DropDownList項,然后添加到DropDownList中,其結果同樣為圖3所示。但這種方法和第一種方法不同,我們可以通過修改語句,為每列文字后補充空格,從而使各列對齊提供了可能,而第一種方法則無法介入。
本例借鑒第二種方法,采用通過AccessDataSource與GridView結合,通過可視操作,使要添加到DropDownList中的數據直接填入GridView中(見圖4),然后設GridView的Visible屬性為False。再通過程序從GridView中讀取數據。這種改進盡管損失了一些網頁反應速度,但在較大程度上降低了程序編寫難度、提高了程序的可靠性和編寫效率。
通過這一改進,所需編寫的向DropDownList中添加數據的程序變得非常簡單。
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(\". 無 \");//添加一個空選列表字符串
myList.Items[0].Value = \"0\";//指定本列表項的值
for (int i = 0; i < GridView1.Rows.Count; i++)
{ //生成列表字符串s,列表字符串s由以下六列組成
string s =FixString( GridView1.Rows[i].Cells[0.Text, 5)//導師姓名
+ FixString( GridView1.Rows[i].Cells[1].Text,25)//題目
+ FixString( GridView1.Rows[i].Cells[2].Text,15)//要求
+ FixString( GridView1.Rows[i].Cells[3].Text, 4)//已將本列表項選為第1志愿人數
+ FixString( GridView1.Rows[i].Cells[4].Text, 4)//已將本列表項選為第2志愿人數
+ FixString( GridView1.Rows[i].Cells[5].Text, 4); //已將本列表項選為第3志愿人數
myList.Items.Add(s);//將字符串s添加到列表中
myList.Items[i + 1].Value = GridView1.Rows[i].Cells[0].Text; //指定本列表項的值
}
}
4 附加空格方法
如何為各列添加定長空格,使得各列最終對齊顯示是本文的關鍵步驟。對于網頁,只能添加中文空格,否則,即使添加再多英文空格,網頁控件和網頁元素都會將所有連續空格視為一個空格并合并為一個空格顯示。
通過實驗發現,要為某列文字后添加適當數量的中文空格,使其定長,需要的計算公式為:
整個列的規定長度+(本列字符數×2-本列字節數)/2
另外需要說明的是:計算一個字符串字節數的方法為GetByteCount();為字符串右側添加字符(包括空格)的方法為PadRight(字符數,字符);
最后,本公式中的除以2為整除。對于包含偶數個英文字符的字符串,正好補充n/2個中文空格,對于包含奇數個個英文字符的字符串,則需在補充(int)n/2個中文空格后,還需要再增加一個英文空格。以下是完整的附加空格程序。
private string FixString(string myText, int myLen)
{
int strLen = myText.Length;//字符串的字數(1個漢字計為1個字)
int bitLen = System.Text.Encoding.Default.GetByteCount(myText); //字符串的字節數(1個漢字計為2個字節)
if ((strLen * 2 - bitLen) % 2 == 0)//如果字符串中有偶數個英文字符,則
return myText.PadRight(myLen + (strLen * 2 - bitLen) / 2, '');
//返回一個添加了半數中文空格的字符串
else//否則
return myText.PadRight(myLen + (strLen * 2 - bitLen) / 2, '') + \" \";
//返回值時,多添加一個英文空格
}
5 各列精確對齊方法
首先通過語句讀取相關列數據時,只能用中文空格填充。在合成各列定長的多列項操作時,除了填充外,還要正確設置字體字號(字體必須是中文字體,即中文字庫)。
除此之外,還有一個關鍵設置。即設置DropDownList的字體字號,不能使用默認值??梢詫⒆煮w設為“宋體”,字號值應為9pt、10.75pt等,不能使用Small、Medium等既定字號。
6 結束語
在ASP.NET開發過程中,使用DropDownList控件中的動態數據綁定技術,通過語句讀取數據的方法,增加了界面的可視化效果、更加人性化的處理??傊?,ASP.NET為網絡的開發提供了一個更成熟、更豐富的環境。
參考文獻:
[1] Esposito D.ASP.NET2.0高級編程[M].施平安,譯.北京:清華大學出版社,2006.
[2] 李玉林,王巖.ASP.NET2.0網絡編程從入門到精通[M].北京:清華大學出版社,2006.
[3] 李萬寶.ASP.NET技術詳解與應用實例[M].北京:機械工業出版社,2005.