2011-03-24 32 views
1

我正在處理頁面加載特定控件的項目,具體取決於可用的索引。加載發生在調用方法PopulateSearchField的頁面加載中。FindControl找不到我動態添加的UserControl

在這個方法中,所有的UserControl都被添加在頁面上:Page.LoadControl(「path」);

頁面加載和所有需要的控件都在頁面上。我的問題是,當用戶點擊搜索按鈕時,事件被觸發,並且基於用戶輸入的這些控件構建查詢。不幸的是,該方法無法產生正確的查詢,因爲它無法找到頁面上的任何控件。

使用一個臨時的ControlCollection變量,我已經能夠看到我的頁面上的控件數量是3,當它應該是從4到10的東西時。集合中的這3個控件是靜態標籤和按鈕這一頁。

我不知道該代碼是否有問題,或者是因爲此解決方案用於框架1.1上的頁面循環問題。是的,我知道這不是最好的辦法,但他們這樣做,我必須讓它工作。

我不確定是否遷移導致了問題。

非常感謝,大衛!

+0

UPDATE:至少在Page_Load或PreInit的末尾,取決於我在哪裏使用PopulateSearchField方法,我可以到達Page.Controls集合,並且所有動態添加的控件都在那裏。只有在Search_Button.click()這些控件不再存在。也許它可以幫助你。 – David 2011-03-25 11:54:05

回答

1

當您單擊按鈕時,當您的點擊處理程序正在處理時,控件不再可用於服務器端。服務器端的頁面不知道您動態創建的控件,因爲沒有用於映射到發佈值的服務器端控件。如果你想查找值,你需要檢查發佈的控制數據,而不是依賴於服務器端的asp.net控件heirarchy。

您也可以通過javascript將所需的所有數據寫入隱藏字段,然後讀取隱藏的數據服務器端,因爲它將被髮布。

以下是發生:

  1. 創建控件上點擊動態
  2. 發佈控制數據
  3. ASP.NET中的數據映射到它知道現行的管制措施。
  4. 您的控件未找到,因此數據未映射到任何內容。

您需要在映射發生之前添加您的控件(在PreInit中)。看看Page Lifecycle,你會看到它如何將所有的控件和數據聯繫在一起。

+0

非常感謝,我會嘗試一下,我會嘗試在preinit之前添加thoses控件,以確保控件已被映射。 – David 2011-03-25 11:47:02

+0

好像在PreInit中添加控件而不是Page_Load也無效。有可能是我沒有抓到哈哈。我會在頁面生命週期中查找所有內容。 – David 2011-03-25 11:48:37

+0

我只是做了一些調試,它告訴我兩件事。在OnPreInit()的結尾處,我的Page.Controls集合有8個元素,這意味着動態搜索字段已被正確添加。但是如果我在Page_Load中放置斷點,那麼Page.Controls現在只有3個元素。這很奇怪,在同一個循環中,我的控制消失了。 – David 2011-03-25 11:58:18

0

當用戶點擊搜索時,是否將控件重新添加到新頁面?

請記住......每次用戶點擊您的服務器以查找該頁面時......都會創建一個新的Page對象。如果您要動態添加控件,則必須在每次加載頁面時執行此操作。

此外,由於您似乎希望將值從控件中取出,因此您必須確保每次都使用完全相同的ID屬性創建控件,並在之前創建了10視圖狀態,如果你想讓他們保留自己的價值。

+0

控件具有相同的ID,這不是問題。如果我至少可以在Page.Controls ControlCollection中看到這些控件,那麼我很容易獲取這些值,但控件甚至不是集合的一部分。 – David 2011-03-25 11:50:15

+0

非常感謝Whomp :),現在我的問題是ID問題嘿嘿。現在你使用的是非常有用的! – David 2011-03-25 12:10:38

相關問題