[Tip]ListView的item轉型成domain object
前言
之前在使用GridView或ListView的時候,要抓某一筆的某一欄時,通常都會在ItemDataBound或RowDataBound使用
e.Item.Cells[0]
e.Row.Cells[0]
//或是myGridView.Rows[0].Cells[0]
問題
這樣的方式,是以Column index做定位,當未來Column有增減的時候,這段code就要跟著改,而且還有index超出範圍的危險,得再多做防呆。
透過Column Name解法
在GridView裡面,也有其他作法可以用Column Name來取代index的作法,可以參考:
- [ASP.NET]GridView的Row.Cells[ColumnIndex]如何改用ColumnName來使用
- 擷取 GridView 資料列的欄位值集合
- MSDN對DataControlField.ExtractValuesFromCell的說明
這個方法已經可以透過Column Name來找到的需要的欄位位置,但這還不夠好。
轉成Domain Object解法
當我們binding一個資料集合給ListView時,如果這個集合是泛型的集合,那我們當然希望可以用該集合裡面的物件型別來進行資料的讀取。
舉例來說:
//ListView的資料集合
IList<MyObject> myCollection =myService.GetData();
myListView.DataSource = myCollection ;
myListView.DataBind();
而在ItemDataBound的事件,我們就可以這樣寫:
protected void myListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
if (e.Item.ItemType == ListViewItemType.DataItem)
{
MyObject currentItem = (e.Item as ListViewDataItem).DataItem as MyObject;
//....之後currentItem就可以拿用MyObject的屬性來用
}
}
結論
我不確定GridView是否可以透過這樣的方式去轉型,因為我現在碰到的系統都是.net framework 3.5以上了,所以幾乎全部都使用ListView了。
有興趣的人可以試試看,我會當作補充說明。
可以的話,應該要至少想辦法做到lightweight ORM,資料的部分應該轉成物件,才能享受抽象意義以及OO的好處。
補充:可以透過下面的方式,將e.Item轉成DataRowView,接著就像使用DataRow的方式,用欄位名稱取值。
System.Data.DataRowView rowView = e.Item.DataItem as System.Data.DataRowView; string currentEmailAddress = rowView["EmailAddress"].ToString();
請參考:http://msdn.microsoft.com/zh-tw/library/system.web.ui.webcontrols.listview.itemdatabound.aspx
blog 與課程更新內容,請前往新站位置:http://tdd.best/