my favorite

2007/11/12

Update GridView BoundField DataFormatString Dynamically

GridView可以說是DataGrid 2.0,個人認為其設計的美意是為了減少程式苦手的煩惱,常常埋首於Paging, Style, 以及Maintain State(ViewState, ControlState)的開發。如果要呈現表格式的資料,那用GridView只接透過簡單的設定,或是加上ADO.NET進行資料來源的設定,都可以用很少的程式碼實作完成(透過SqlDataSource,甚至一行都不用)。

然而,在真實的企業應用中,卻常常有動態更新資料格式的需求,例如T公司要求如下:NTD、JPY數值直接四捨五入取整數位,USD則是取到小數點第二位,而其它幣別諸如HKD等,都要求到小數點第四位。然而ERP系統中,幣別在每一張表單中不盡相同。因此,使用同一種的DataFormatString勢必吃鱉。

利用關鍵字gridview, boundfield, 以及dataformatstring在網路上找尋良久,看到有一些人問,卻找不到任何的solution,幾乎95%的問題都是在詢問DataFormatString沒有作用,而解答只是簡單一句關閉HtmlEncode即可(HtmlEncode="false"),確實令人非常沮喪。

氣餒之餘,乾脆自己透過GridView的Server Event進行測試。由於DataFormatString設定完後,格式化工作是在Server Side進行處理(由Client Side,也就是Browser上只看到格式化後的資料便可得證),於是在GridView的PreRender事件裡,我將GridView.Columns(Type為DataControlFieldCollection),直接以foreach進行iterate,在取得每一個DataControlField後,直接轉型至BoundField。如此一來,便可以取得BoundField下的所有資料及屬性。其中需要用到的屬性有三個:DataField, DataFormatString, HtmlEncode

舉例來說:如上述的依照幣別動態設定不同的DataFormatString,便可以撰寫如下

foreach(BoundField field in GridView1.Columns) {
if (field.DataField.Equals("FIELD_NAME")) {
if (_curr.Equals("NTD") || _curr.Equals("JPY")) {
field.DataFormatString = "{0:N}";
}
else if (_curr.Equals("USD")) {
field.DataFormatString = "{0:N2}";
}
else {
field.DataFormatString = "{0:N4}";
}
field.HtmlEncode = false;
}
}

No comments:

BIO

Taipei, GuTing, Taiwan

huang47 | personal

huang47 | personal