筆記:以List<object>作為Gridvew的DataSource,以購物車為例

摘要:以購物車為例,用類別,實作Gridview可讀取的DataSource,筆記:List轉型失敗,而列舉型態內的資料類別中若是欄位的形式的話,不能被Gridview讀取喲

 

前陣子玩了一些Lin Q的東西。號稱底層的程式,都幫你做好了,雖然資料庫存取的程式從來沒見過,不過只要取用他幫你建好的物件模型,透過適當的處理,就可以幫你把資料對實體資料庫的吃喝拉撒都處理好了。

當然有的時候,你會希望不是顯示單一資料表的完整的資料庫欄位而己(很多範例也僅止於此)

(例如購物車,它只是一個暫存的結構,但是他對應到產品、訂單不同資料表的欄位

以往我們都會用sql寫到不同的資料庫。必竟因為在資料庫裡面,他們就是不同的資料表。)

 

所以,就會想到是不是用Datatable或Dataset建一建結構,再把物件裡的資料一一取出,餵到Gridview呢?(總是被以前的寫法影響)

 

曾經想這樣做的同時,發現Datatable相對於其他資料儲存的方式,實在是太佔記憶體了就此打住。

 

後來,再想想,覺得Linq對資料庫的欄位的存取其實也是一種用類別再去做結構的呈現。因此,透過類別來定義一個暫存的資料結構就更理所當然了!

 

以購物車為例,你可以想像購物車是一個容器,而裡面是你想要買的產品

至少,我們可以先定義產品:可能包含了產品名稱,標價,你要買幾個之類的”屬性 或欄位”,用Linq之後,最方便的就是取資料變的非常的人性化了!只要建好Context,就可以對呼風喚雨。所以只要再建一個空的CartItem的容器,裡面包含了你想要購物車顯示的”欄位”,像是產品名稱、數量,單價與小計,接著你可以透過之前Linq定義出來對產品資料表的類別,來取得資料,所以假如你想新增一個購物車裡面的物件(產品)的時候,你只要new一個CartItem,然後建構式定義,用Linq去取得產品資料表(類別有定義)的資料,放到CartItem的欄位中。

至於Cart購物車本身,是否要用成一個裝載資料的類別呢?我懶得再搞一個類別出來了,因為.NET購物車只是暫存的資料結構,對於購物車本身,我用List<CartItem>來裝載就好了,每次只要add就買了一個咩!!而對購物車的方法,我選擇寫在CartService的類別中,裡面定義了一些靜態的方法。例如計算購物車的物件。

 

想著想著,我的流程也很簡單

就是頁面在run的時候,先去Session中,看看有沒有叫作Cart的session物件,沒有的話,就new一個購物車的list囉,然後放回session中,若有的話,就把Session物件倒出來,轉型成購物車的list,泛型型別自然就是CartItem。然後再給gridview去讀就好了。

不過,馬上,這邊就出現了個大問題…就是我session讀出來的物件,沒有辦法給Gridview來讀。他會說,找不到某個欄位或屬性!

在選取的資料來源上找不到名稱為 'ProductID' 的欄位或屬性。

不過回頭去看,明明就定義好了

public int ProductID;
public string ProductName;

…諸如此類

可是,用Linq讀出來的物件List都可以讀啊!為什麼我不可以呢?

因此回去Linq對資料表類別的定義,發現最大的差異就是:屬性與欄位

因此我改成這樣

public int ProductID{get;set;}
public string ProductName{get;set;}
public decimal ProductPrice{get;set;}
public int ProductQuantity{get;set;}
public decimal SubTotalPrice{get;set;}
public string More{get;set;}

終於ok了!

原來,假如沒有給類別的變數設定存取子,那就僅只是欄位,而不是屬性。

屬性,才能給gridview來讀(不過錯誤訊息說屬性與欄位呀?算了,至少屬性ok就好)。

 

這樣,我們也可以快速的透過建立類別,來自訂我們自己想在Gridvew呈現的資料結構了!

 

上述購物車的結果顯示如下

擷取

 

後續結帳,當然就不同的資料庫的物件類別(例如訂單以及訂單名細),透過Linq做存儲的動作啦。