2010-05-18 71 views
1

我正在構建一個自定義母版頁類型控件,即有點像數據網格,但應該更容易將自定義功能添加到它。它很好,但部分功能是有一個可以打開和關閉的分頁控件,並且該控件的一部分將是一個顯示當前頁碼的文本框,並且在TextChanged上重定向到數據集的新頁面。如何將事件添加到嵌套的服務器控件? (ASP.Net)

我遇到的問題是,在技術上有其事件的文本框燃煤嵌入嵌入在你實際上提上有點像


 頁的控制的控制|
顯示控制
  |
尋呼控制
  |
文本框

埋沒在那裏事件沒有發射。更糟糕的是,回發的javascript甚至沒有寫入頁面(頁面上沒有任何內容發佈到目前爲止,這是唯一真正需要的)。

我一直在谷歌拖了很長一段時間,並拿起我需要實現INamingContainer(完成),我需要將控件添加到頁面的控制樹(Pre_Init太遲了嗎?把控件添加到頁面的好時機?),那麼顯然,事件應該會觸發。但我一直無法找到這方面的最佳實踐的例子,有不少失敗的人在那裏有人擔心,但這不是一個按鈕。

因此,任何人都可以指向我的方向獲得嵌入控件嵌入控件嵌入到控件添加到頁面正常行爲?

+0

不確定完整答案,只是想解決兩個部分:init可以添加控件; pre_init可能爲時過早;其次,事件通常需要冒泡,比如當你點擊GridView中的一個按鈕時,點擊事件泡泡直到網格來觸發適當的事件; RaiseBubbleEvent是冒起事件的方法。看起來像TextBox不會冒泡改變的事件... – 2010-05-18 12:49:33

+0

就是這樣......冒泡的事件。是。現在,我們如何做到這一點,我已經完成了迄今爲止提出的所有改變,但仍然無效。 – bert 2010-05-18 14:04:03

回答

0

答案是上面的回答的組合,並在原來的問題的評論。讓事件發生的關鍵是確保你的控件(父和子)繼承自CompositeControl和INamingContainer,例如

public partial myControl:CompositeControl,INamingContainer 
etc... 

然後你重寫你的複合控件的CreateChildControls()方法並創建你的控件並在那裏進行連線。這將確保正確的冒泡。並意味着事件處理髮生在您的對比控件中...

0

只有當您打算將自定義控件的多個實例添加到同一頁面時,才需要使用INamingContainer。它所做的是啓用唯一的ID生成,因此您不會以具有相同ID的控件結束。我建議您在創建自定義控件時繼承CompositeControl。 Pre_Init不算太晚。事實上,考慮到生命週期,這是相當早的。您可以實例化自定義控件,並將它們添加到很多地方的實時控件集合中。我建議你在Page_Init(在viewstate被加載之前)或者Page_Load(在加載視圖狀態之後)中做它。即使您稍後在頁面生命週期中添加它,控件也會趕上事件。 要訂閱子控件的事件,你可以使用FindControl方法:

MyControl myControl = Page.FindControl("MyControl1"); 
TextBox textBox = myControl.FindControl("TextBox1") as TextBox; 
+0

這一切都很好,我看到你來自哪裏,但重要的是textchanged事件駐留在分頁控件中,而不是駐留頁面中。所以從頂級頁面訂閱活動不會幫助我。布賴恩在評論中談到的更多的是冒泡的事情。不過謝謝。 – bert 2010-05-18 14:03:13

相關問題