2008-10-10 27 views
2

好了,所以顯而易見的答案是,因爲複合控制的流程要求我的childcontrols在某個時間點創建。我認爲其他人也必須擁有一個問題。爲什麼要在CompositeControl上的CreateChildControls()中創建我的子控件?

我的控件是一個複合「容器/集合」控件。它將被一個對象提供並基於該對象數據創建一些childcontrols。因此,我的控件將呈現一個標題(總是)和x數量,例如TextBox控件(基於它所提供的對象)。我創建我的頭在CreateChildControls()顯然,但我不可能創建我的文本框在那裏,因爲我不知道是否對象(基於文本框)已經餵了嗎?我想暴露一個屬性/方法來設置/饋送對象,但我不知道什麼時候會被調用。

那麼我該怎麼做?我的意思是我不可能在CreateChildControls()中創建TextBoxes,或者我可以嗎?我的意思是 - 什麼時候CreateChildControls()調用 - 我知道我可以調用EnsureChildControls()(我已經在一個屬性中設置頭文件的innerText - 因爲我需要在設置它的innerText之前創建頭)。

這個怎麼樣

var c = new MyContainerControl(); 
c.Header = "fun"; 
c.TextBoxObject = myTextBoxes; 

這會產生一個錯誤(或者最好不要產生任何TextBox'es)如果我把文本框的建設的CreateChildControls()。

相反,只是將Header存儲在成員變量中,因此不必在公開的方法/屬性中設置Header innerText中的EnsureChildControls()方法。我只是不太喜歡這個問題,因爲它會通過增加額外的邏輯來臨時存儲並且稍後必須弄清楚什麼時候設置它(可能在PreRender中)而使事情變得複雜。

另外我想我可以做一些Databound控件,確保數據在調用.DataBind()時出現。我真的不喜歡這個,因爲從上次我看創建數據綁定控件它變得非常複雜。

這確實應該是一個容易的任務來解決 - 我知道我失去了一些東西的地方......

回答

1

什麼你所描述的是一個數據綁定控件。是的,這有點複雜,但它是這種類型實例的適當設計範例。

這就是說,你是否考慮過使用中繼器控制而不是嘗試推出自己的組合,其行爲方式完全相同?與其傳遞一個隨機對象,不如將它傳遞給一個集合或一個帶有你想要的文本區域的iList。

+0

你有幾個點在那裏:)我想我會嘗試中繼器的aproach,然後回來以後:) – 2008-10-10 13:28:04

相關問題