2012年8月16日

[ASP.NET] 在不同的 ContentPlaceholder 中設定 ControlID

有在用 MasterPage 的朋友都知道 ContentPlaceholder
而且主頁中可以放多個 ContentPlaceholder 來讓畫面更有變化且更有彈性
但如果是這種情況,可就要小心本篇中提到的問題囉

I. 多個 ContentPlaceholder

tmp01
可以看到,MasterPage 中可以一次放入多個 ContentPlaceholder
所以坎尼建了個 TooManyContentPlaceholder 的頁面,並選擇這個主頁
tmp02 今天有個需求是要依輸入條件撈出所有符合條件的資料
於是很合情合理的先在畫面上放個輸入框,令使用者可以輸入查詢條件
再放個 Gridview 來顯示條件
不過為求方便,就用 ObjectDataSource 來和取得資料的方法溝通
tmp03 由於坎尼自訂的方法 GetAllData(String MyName) 需要傳入參數
於是就把 TextBox1.Text 當成參數來源設定給 ObjectDataSource 使用
tmp04最後把 GridView1.DataSourceID 設定成畫面上的 DataSource
好了,測試沒問題就可以把程式交付給客戶了~ 樂勝~ 樂勝~

(把頁面跑起來)

tmp05
080725112520xmitead 
啊是在玩我是嗎?
ID也是你叫我設的,我也選了 (詳見圖3及圖4),現在你跟我說找不到 ID (翻桌)

II. 冷靜


好,我們平心靜氣
經過谷歌大神的一番指導之後,坎尼發現完全找不到解決方案 XDDDD
因為大家都在談的是 MasterPage.FindControl 這個問題 (坎尼很久之前也有寫過一篇)

但在一陣誤打誤撞之後,不小心被坎尼試出來了:
若要設定不同 ContentPlaceholder 裡的 ControlID, DataSourceID, TargetControlID…請用該 Control 的 UniqueID

(就是長的像 ctl00$ContentPlaceholder1$TextBox1 這類的ID)

tmp06
把 DataSourceID 和 ControlID 改成 UniqueID 之後,頁面就正常運作了
tmp07

III. 小結


這次遇到這個問題的心得是:谷歌不是萬能 XD
所以記下這篇讓它更聰明一點

此次的範例下載

2012年8月15日

[ASP.NET] 調整傳給 DataSource 的參數值

最近在用 ObjectDataSource 時發現,取回的資料與預期不符
稍微研究一下,發現是參數在搞鬼
於是寫了這篇範例給以後有遇到相同問題,或是有調整參數值需求的人

I. 程式碼配置與情境說明


功能需求取回符合時間區間的登入資料
所以畫面上配置了兩個日期輸入框,以及一個送出按鈕
接著則是 Gridview 及 ObjectDataSource
odp01
給 ObjectDataSource 呼叫的方法則是到資料庫取得資料
可以看到有兩段 where 的判斷式,分別判斷該不該加入起始或結束的條件
odp02
參數的資料來源就是畫面上的兩個輸入框文字
傳入到 Method 的型別則是 DateTime? odp03
寫好之後開啟虛擬伺服器看運作情況
嗯…Great! 看起來沒什麼問題
odp04
但是!!
如果這麼簡單就結束,坎尼就不用寫這篇了…
由下圖可以看到,當日期條件是同一天時,則會顯示不出資料
odp05 嗯,難道這是父親節的詛咒嗎?
0

II. 偵錯

於是坎尼開了偵錯模式開始追蹤問題在哪
odp06
odp07
很幸運的馬上就找到問題點了:

傳入的 DateTime 參數如果只有日期的話,會自動設定在00:00
在 8/8 00:00 ~ 8/8 00:00 之間當然找不到資料
此時較好的解法就是在傳入時把值抓出來做調整之後,再送去查詢

問題是,要在哪個事件攔截參數?
odp08
沒錯,就是在 DataSource 的 Selecting 事件!
處理步驟如下:(可搭配上圖一起使用)
  1. ObjectDataSourceSelectingEventArgs.InputParameters 取出參數
  2. 將參數轉型
  3. 處理參數值
  4. 存回參數裡
如此一來查詢的區間就會在 0 時到 24 時之間

坎尼突然想到以前公司同事都是用字串傳日期,加上 00:00:00 和 23:59:59 之後再去 parse,好像也是個不錯的土法煉鋼的方法啦…

再把網頁跑起來一遍,查詢區間都設定為 2012/8/8
odp09
很好,有資料了! 收功!

III. 小結

所有的 DataSource 物件皆有 Selecting 事件
但需要處理參數的大概只有 ObjectDataSource

另外處理參數的時候要注意轉型和 Nullable 型別的判斷
否則可能測試時沒問題,但一上線就有機會發生例外!

此次的範例下載 (不含資料庫)

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D