[ASP.NET] GridView CRUD - 如何把ID轉為顯示的值

前言:
我想很多大大寫ASP.NET的時候也會遇到同樣的問題: 很多時候為了很多原因, 例如Data size, 速度, 不過度扁平化資料表等等, 在資料庫的設計上我們會進行normalization. 例如公司名稱用CompanyID取代, 然後把真實給人看的名字分割到另外一個Table.

因此當我們要把資料顯示在Presentation layer(就是使用者介面)的時候, 一定逃不過要把資料表JOIN起來.

傳統的做法是把JOIN好的SQL直接寫在SqlDataSource裡面. 這樣很方便是沒錯, 不過除了在維護上會很困難, 也違反了把Data access layer跟Presentation layer 盡量loosely coupled的原則.

不過好死不死, ASP.NET 的Gridview功能實在有點雞肋, 它不能像dropdownlist一樣可以選擇Display value. 我自己之前用的笨方法是先把只有值的table跟Gridview進行連結, 再寫一個class放在Data bounded的事件中把值換成顯示的值. 老實說真笨....

前幾天又遇到了老問題, 我堅決不相信就是沒有解決方法, 查了MSDN老半天 終於守得雲開見月明, 柳暗花明又一.....(喂).

方法:

準備工作:

  • 先用XSD檔案(Dataset)描述資料表, 例如公司資料表中的CATEGORY欄位對應顯示用資料表COMPANY_TYPE的COMPANY_TYPE_ID. 
    另外資料表中的TableAdapter使用最簡單的SQL STATEMENT, 例如資料表COMPANY使用的就是select * from COMPANY, 完成後應該會自動產生UPDATE, INSERT跟DELETE的指令.
  • 接下來修改COMPANY資料表. 在COMPANY資料表上的TableAdapter按一下右鍵->Configure
  • 把原來超簡單的sql換成下面這一句


    好像很難, 說穿了其實只是在原本COMPANY資料表後面加上要願示的欄位而已. 改好了以後按NEXT NEXT NEXT到OK就可以了.
實作:

設定ObjectDataSource
  • 首先反回aspx頁面, 抽一個ObjectDataSource叫ObjectDataSourceCompany, 在ObjectDataSource上按下Smart tag, 選取 "Configure Data Source"
  • 選取COMPANY資料表的TableAdapter, 按下一步
  • 確認一下SELECT UPDATE INSERT DELETE的Tab是否已經自動填好, 然後按FINISH.
綁定Gridview bounding
  • 在Gridview中的Smart tag選取剛剛設好的Object Data Source.
  • 再打開Smart tag, 選取Edit Columns, 在Selected fields中把不需要顯示的欄位刪除掉.
  • 現在跑一下看看...
  • 登登登登, 原本Category只有ID的欄位現在變成文字了.

參考資料:
Tutorial 1: Creating a Data Access Layer

Popular posts from this blog

[SQL SERVER] 找出LOCK方法懶人包

[SQL Server] 解決log檔(ldf file)過度膨脹的實戰經驗

[開箱] Dell P2415Q 4K螢幕開箱