但到最近才因同事的一句話而發現今天要示範的作法
首先 先來講解一下事件大綱
從前從前,坎尼的同事寫了支 UserControl--用來顯示某種類別的下拉選單
當然是動態的從資料庫撈出來給使用者選擇
新增時一切運作正常
修改時卻因某種緣故 一直無法指定類別 (使用者新增時設定的)
說到這邊 那個"某種緣故"請參考 UserControl 事件的觸發順序
「原來是事件順序不同 所以在 Page_Load 時 UserControl 卻還沒產生下拉的選項」
坎尼雖然當時知道了這個 卻不知道該如何解決
因為 Google 到的資料 好像都要去改寫事件的觸發順序?
(懶惰如坎尼 當然就放棄這個作法 自己重新在頁面上放個下拉選單重寫事件 XD)
最近同事的一句:「不知道可不可以傳參數?」
坎尼
以下來看範例
首先是 UserControl (vs 2008的切割畫面真好用)
畫面上有個未繫結的 DropDownList
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjL-vZTT-4_ATdSkeIxHsDurKqZYENr1HyUmBBNICDdAEc6aJT2Qbga-4s6f7ZNlgT4j04MbG2bCn-TW6I8qWU_RqsDfhZeibxQtQuX_6WWfxhsT-SNEHNyh4xLe21RSPgn4-ldRQUBq944/s400/ucv5.png)
然後是執行頁
這邊分別做了來源頁 (有RadioButtonList)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjB3FhaXIooruuhe7NnGtVOyOsF31OKCdub57qZz78vwqN0yHe1sBCBr9FRsNrRcoPOMbBr9-v3bhcDXxtkhdoshzDj_kL__2h219cbZRb0fDUuVIjbIil0CLHq0j_qrzriNnZ7W_CFZYU6/s400/ucv3.png)
和目的頁 (只放 UserControl)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiCGg-6j4VtXy1NORCUSs1Yf66r0r3MskRhjafVwwa1ZNxpavb7qjcCRArxNT3bujPDmXNMnnwNU_VRS00w-HrddLmVI9F2d23ltwuVVBweWmw0wczo8yVoybN1IIInn0pwh7XUv_upXM3/s400/ucv4.png)
接著來看關鍵的UserControl裡的事件
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYMbUkC-7HhMObQ0cr2noLpI1Y1U4m2bi5I8Tchmj8SQBPUSCOJTqmn6KmtA2Xo8-i6Egq6b5yOoehjZDNfsHxjmNy6CZutS5dn0yPPoiIF7tZYuXpgYIq9jKfVEuPbBToJ6qf__TDd4Ht/s400/ucv9.png)
由上圖可以看到
在第一次執行時 會動態的加入下拉選項
由於上述的動作 會造成 UserControl1.FindControl 的方式抓不到選項
所以坎尼加了個 mySelectedValue 屬性
並在 UserControl 的 Page_Load 時去判斷有沒有值 再指定給 ddl
使用上很簡單 只要把要選擇的 value 指定給 mySelectedValue 即可
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjm9pldDV01CASzGqsfHnn1jQoYzzmgOjY2z-XfY9Mhg8qz-6HkTyn1djp8LN71zcnmw_zWMpZlrEZEnFPhV5CKuSDJ4eyZyUz8ZyZUqIpUBaUGN2aDgq7CzAqAisRB-UgfRr6Sxu5evOTP/s400/ucv6.png)
下圖為實際執行畫面
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1We3Pu8Dqce2CGhklBg7Tee5rGozpEVxocyX3oXfTHsVji_-Cjtyg4DvsCc-DPZ9LbScyaBpOGMPN2oZRvyqn0QdHjT9FebbhaTgqh6uTNzkyfMwXzbafHdi0i10Onjfdd50w0Uos3tKs/s400/ucv7.png)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio9EwG7a8nVZdkjcvCcb1LYCVq1Yt9IFm6usEyBc9UcMrNLX4ADZeIYbd8dxafu1G1fnXcX1-eymSTDIdigMfquZ_GtViQbeEF5Xc4quH65wpwKTcey0Tx-NbrWMEf6Ncp_G2Ko99BS2jH/s400/ucv8.png)
如此就可以輕鬆的把值指定給 UserControl 中的動態控制項
不用再去 override 原本的 Page_Load 事件
最後是這次的範例程式 點我下載
補充1.
若是下拉選單非動態產生 (就是自己已經先加入)
直接使用 FindControl 再去指定即可
補充2.
上述的方法適用於不會 AutoPostBack 的 UserControl
若是引發了 PostBack 會造成 UserControl 的屬性值消失
解法就是 頁面指定屬性的那段要寫在 Page_Load 裡
讓頁面每次刷新時 再次去指定屬性給 UserControl
沒有留言:
張貼留言