2014-02-25 33 views
1

對於長期問題,提前抱歉。因爲我遇到StackOverflow異常(諷刺),我知道原因,我真的想知道我是否有我的概念,如何實現FindControl的權利。什麼是實施FindControl的正確方法

我的想法是,如果你正在實現一個自定義的子控件​​集合,應該可以被FindControl訪問,你必須實現FindControl並且搜索你的列表,除了調用基本方法。

所以這是現在的情況: 我寫了一個服務器控制,它有一個templateproperty(我在init上添加)。讓我們稱之爲「面板」現在(這不是默認的ASP一個)

我的結構是沿此線:

我的變化發現控件現在之前
panel (1) 
panel (2) 
    telerik:RadTabStrip 
panel (3) 
    telerik:RadMultiPage 

工作確定,不同之處在於如果radTabStrip將通過它的id尋找多頁,它將開始尋找2,因爲它不是一個直接的子頁,因此它顯然無法找到其他多頁。

我的更改是轉到NamingContainer (導致3)並循環通過子控件並在那裏執行FindControl。這最初解決了這個問題。

但是,在一個有3個孩子的結構中,期望的控件是第三種搜索方式時,會導致第一個和第二個面板之間來回跳動。所以這是一個觸發StackOverflowException的兄弟搜索,這是有道理的。

然而,顯然這對我提出了一個問題,如果我實際上並沒有在那裏做一些非常錯誤的事情。其他控件似乎沒有任何麻煩地查看NamingContainer的層次結構。

是否有一些ID名稱寄存器(例如,命名容器中的所有控件都註冊了它們所包含的ID,並且在findcontrol中,您只需要查找某個類就可以找到所需的控件,而無需通過任何定製邏輯瀏覽控件並調用FindControl)我不知道,或者類似的東西?

我真的希望你能幫助我這個。

我有一個想法如何解決我的問題這個問題,但我很想知道如何實際做到這一點應該是正確的做法。

回答

1

每個控件都有自己的控件集合,它是'內置的' - 您不需要'命名註冊'。

您基本上需要一個遞歸函數: 寫入,例如MyFindControl,以便它接受Control-Collection作爲參數。 您的函數是否遍歷該集合,並且如果您找到要查找的控件(按名稱?),請將其返回。

如果您當前正在查看的控件不是您正在查找的控件,請讓您的函數再次自行調用,並將該控件的控件集合作爲參數。

如果正在搜索的控件沒有打開,則可以返回NothingNull(取決於您的語言),也可以提出錯誤。使用您的自定義FindControl實現的代碼必須處理該代碼。

+0

這不會解決beeing無法在父/兄弟層次結構中找到控件的問題。通過兒童遞歸不是我遇到問題的情況 - 這將是相當容易和通用的修復。 – Dbl

+0

你可以編寫一個像'GetParent'這樣的幫助方法,一直到最高的實例(例如Master Page),然後用上面的(是的,非常基本的和通用的)方法遍歷控件。 – Alexander

+0

所以你說的問題是,我正在爲FindControl的其他控件的實現工作,這反過來導致無限遞歸。我敢肯定,這可以工作,但它似乎是一個可怕的很多控制遍歷,並且只能用於Controls屬性公開的控件。 FindControl通常提供搜索未由控件屬性公開的控件。 這就是爲什麼我這樣做,爲什麼它不適合我。 – Dbl

相關問題