[Tip]ListView的item轉型成domain object

  • 5522
  • 0
  • 2012-03-30

[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的作法,可以參考:

  1. [ASP.NET]GridView的Row.Cells[ColumnIndex]如何改用ColumnName來使用
  2. 擷取 GridView 資料列的欄位值集合
  3. 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/