2010-01-25 28 views
0

我正在寫什麼,我將調用一個調查系統。這些調查將由一系列問題組成,分成若干部分。調查定義將存儲在數據庫中。問題可以是各種類型,具有不同的輸入方法和驗證(例如,文本框,數字文本框,選擇列表等)。我創建了一組映射到不同問題類型的用戶控件。我想從調查定義邏輯中完全抽象出調查呈現邏輯。我認爲我會這樣做的方式是使用一個啞呈現控件,它只需要一個控件集合並在每個循環中呈現它們就是我正在做的超級簡化版本。將用戶控件作爲變量傳遞

private void RenderControls() 
{ 
    foreach (UserControl CurrentControl in this.ControlsToRender) 
    { 
     MyPlaceholder.Controls.Add(CurrentControl) 
    } 

} 

這種方式的作用是將正確的控件添加到佔位符中,但沒有任何呈現。大概這是因爲它沒有在asxc文件中的標記。

如果我做這樣的事情

private void RenderControls() 
{ 
    foreach (UserControl CurrentControl in this.ControlsToRender) 
    { 
     MyPlaceholder.Controls.Add(this.LoadControl("path to ascx file") 
    } 
} 

它將創建控件的正確的號碼,但我不希望在這裏實例化控件,因爲我需要根據cconditional邏輯來設置不同的屬性我想從這個純粹的渲染層抽象出來。

我想要做的是實例化其他控件,其中,設置相關的屬性,然後只是將這些集合傳遞到呈現控件渲染出來。

有沒有辦法用用戶控件做到這一點?我需要創建自定義控件嗎?

回答

1

.ascx usercontrols很難製作成可分發的便攜式組件。有辦法做到這一點,但他們有很多限制,需要幾個步驟。最後它不值得。

最好的辦法是製作封裝自己渲染的自定義控件。

+0

之前,這就是我算了一下,我希望有辦法做到這一點,而不必寫我自己的渲染方法。 – 2010-01-25 19:57:05

+0

最簡單的事情就是讓自定義控件擴展Panel,然後在其構造函數中,將所有佈局和子控件添加到自己的Controls集合中。您不必以這種方式編寫任何渲染邏輯 - 您可以將所有內容都安排在Controls集合中。 – womp 2010-01-25 20:00:54

+0

啊當然,我認爲這是去這裏的路。 – 2010-01-25 20:05:00

0

你也可以做,但聽起來像你可能想要使用自定義控件。

您可以通過暴露用戶控件上的屬性來使用用戶控件。

MyPlaceholder.Controls.Add(CurrentControl) 

當你到達上述行時,控件已經被實例化。只需在實例化上設置這些屬性,並且應該設置。

另外,您可以設置的屬性隨時呈現

+0

問題不在於設置屬性或實例化控件,而是在別處完成並且工作正常。問題在於它們不呈現任何內容,因爲它們沒有標記,這存儲在ascx文件中。 – 2010-01-25 20:08:25