2009年1月12日

如何設定UserControl中動態產生的控制項初始值

今天講的這個也是坎尼一年前遇到的問題
但到最近才因同事的一句話而發現今天要示範的作法

首先 先來講解一下事件大綱
從前從前,坎尼的同事寫了支 UserControl--用來顯示某種類別的下拉選單
當然是動態的從資料庫撈出來給使用者選擇

新增時一切運作正常
修改時卻因某種緣故 一直無法指定類別 (使用者新增時設定的)

說到這邊 那個"某種緣故"請參考 UserControl 事件的觸發順序
「原來是事件順序不同 所以在 Page_Load 時 UserControl 卻還沒產生下拉的選項」
坎尼雖然當時知道了這個 卻不知道該如何解決
因為 Google 到的資料 好像都要去改寫事件的觸發順序?
(懶惰如坎尼 當然就放棄這個作法 自己重新在頁面上放個下拉選單重寫事件 XD)

最近同事的一句:「不知道可不可以傳參數?」
坎尼頭上閃過了新人類閃電符號 「そこだ!!!!」馬上去試驗了這個作法
以下來看範例

首先是 UserControl (vs 2008的切割畫面真好用)
畫面上有個未繫結的 DropDownList

然後是執行頁
這邊分別做了來源頁 (有RadioButtonList)

和目的頁 (只放 UserControl)


接著來看關鍵的UserControl裡的事件

由上圖可以看到
第一次執行時 會動態的加入下拉選項
由於上述的動作 會造成 UserControl1.FindControl 的方式抓不到選項
所以坎尼加了個 mySelectedValue 屬性
並在 UserControl 的 Page_Load 時去判斷有沒有值 再指定給 ddl

使用上很簡單 只要把要選擇的 value 指定給 mySelectedValue 即可

下圖為實際執行畫面


如此就可以輕鬆的把值指定給 UserControl 中的動態控制項
不用再去 override 原本的 Page_Load 事件
最後是這次的範例程式 點我下載

補充1.
若是下拉選單非動態產生 (就是自己已經先加入)
直接使用 FindControl 再去指定即可

補充2.
上述的方法適用於不會 AutoPostBack 的 UserControl
若是引發了 PostBack 會造成 UserControl 的屬性值消失
解法就是 頁面指定屬性的那段要寫在 Page_Load 裡
讓頁面每次刷新時 再次去指定屬性給 UserControl

沒有留言:

Google Spreadsheet 裡用規則運算式

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