好的,显而易见的答案是,因为复合控件的流程要求在某个时间点创建我的子控件。我遇到了一个问题,我认为其他人也一定有这个问题。
我的控件是复合“容器/集合”控件。它将被一个对象提供,并根据该对象数据创建一些子控件。所以我的控件将呈现一个标题(总是)和x-number,比如TextBox控件(基于它所提供的对象)。
我显然在CreateChildControls()中创建了我的标题,但我也不可能在那里创建我的TextBox,因为我不知道该对象(基于TextBoxes)是否已经被送入了?我想过暴露一个属性/方法来设置/喂食对象,但是我不确定它什么时候会被调用。
那我该怎么办?我的意思是我不可能在CreateChildControls()中创建TextBox,或者我可以吗?我的意思是 - 什么时候CreateChildControls()调用 - 我知道我可以调用EnsureChildControls()(我已经在一个属性中设置了标题的innerText - 因为我需要在设置其innerText之前创建标题)。< / p>
这个怎么样
var c = new MyContainerControl();
c.Header = "fun";
c.TextBoxObject = myTextBoxes;
如果我将TextBox的构建放在CreateChildControls()中,那么会引发错误(或者最多不会创建任何TextBox')。
只需将Header存储在成员变量中,因此不必在公开的方法/属性设置Header innerText中调用EnsureChildControls()。我只是不喜欢这种方法,因为通过添加额外的逻辑来临时存储并且稍后必须弄清楚何时设置它(可能在PreRender中)会使事情变得复杂。
此外我想我可以进行某种数据绑定控制,确保在调用.DataBind()时存在数据。我真的不喜欢这个,因为最后我看到创建数据绑定控件它变得非常复杂。
这真的应该是一个容易解决的问题 - 我知道我在某处遗漏了某些东西......
答案 0 :(得分:1)
你所描述的是一个数据绑定控件。是的,它有点复杂,但它是这类实例的正确设计范例。
那就是说,你考虑过使用转发器控制而不是试图推出你自己的复合材料,它的行为完全相同吗?不是传递一个随机对象,而是传递一个集合或带有你想要的文本区域数量的iList。