顯示具有 MasterPage 標籤的文章。 顯示所有文章
顯示具有 MasterPage 標籤的文章。 顯示所有文章

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
所以記下這篇讓它更聰明一點

此次的範例下載

2009年1月9日

在套用主頁(MasterPage)的頁面中使用跨頁傳值(CrossPagePostback)

這次要來談的是
如何在套用 MasterPage 的頁面 取得 CrossPagePostback 傳來的值

其實這問題最早是發生在坎尼的好友 kk 身上
當時他問坎尼 Gridview 是不是不能用來跨頁傳值?
因為他用 PreviousPage.FindControl 一直是抓到 null
他有說他套用了 MasterPage 不過坎尼沒放在心上 還以為是 .net 的限制(小聲說)

直到最近 坎尼也用了 MasterPage 來統一頁面的樣式
好死不死的也玩了一下 CrossPagePostback 果然也抓不到前頁傳來的值
於是坎尼寫了個迴圈把前頁的 Controls 資訊列出來
才發現 原來 MasterPage 真的會影響到 PreviousPage.FindControl 抓到的資料

下面就來看個範例
首先坎尼寫了個 A頁B頁 都套用了 m1.Master 的主頁

A頁中有個 Textbox CheckBoxList 這是待會要傳值用的
另外有個 Button 可以看到它的 PostBackUrl 已設為B頁

B頁有個 Label 待會要用來顯示相關資訊


不過到這邊要先停一下
冒然的用 PreviousPgae 去抓值的話 會抓不到前頁的控制項

首先在B頁的 Page_Load 呼叫下圖的Method
(圖看不清楚的人 待會會有 source code 的下載連結)


下圖就是 print 出來的結果

可以發現 第一層的 Control 只有 master 1個 !!!!
在A頁上的 Controls 到了第四層的才出現
也就是在 ContentPlaceHolder1 底下 (見圖中紅框框處)

再來看一下 m1.Master 中的配置

會發現 第2層其實是先對應主頁上的配置
ContentPlaceHolder 是位於 第2層的 form 底下 故為第3層
A頁中加入的 Controls 當然就是第 4 層

上面講這麼多 不知道大家有沒有理解了這個階層觀念????
簡單來講 CrossPagePostback 抓到的 PreviousPage 物件
會依 MasterPage -> Controls in Master -> ContentPlaceHolder -> 前頁 Controls

故抓取前頁的控制項時
要用 PreviousPage.Controls[0].Controls[3].Controls[1].FindControls 的方式

此時我們就可以在B頁的Page_Load事件 呼叫下面的方法
(先抓到前頁的 ContentPlaceHolder 再用它去 FindControls )
將前頁輸入及勾選的值 輸出在畫面上

來看一下實際執行畫面

中間就是前頁傳來的內容


對了 由於快到春節了 所以坎尼把畫面做的有過年氣氛點 :D
希望大家有吸收到此次的教學內容
最後這邊是此次的範例程式碼 點我下載

後註. 本篇昨天就應該發表了 (看發表時間就知道)
不過坎尼昨晚看到湘北打輸海南 心裡覺得很難過
最後黯然的跑去睡覺 Q_Q

Google Spreadsheet 裡用規則運算式

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