代码之家  ›  专栏  ›  技术社区  ›  Per Hornshøj-Schierbeck

为什么要在CompositeControl上的CreateChildControls()中创建我的子控件?

  •  2
  • Per Hornshøj-Schierbeck  · 技术社区  · 16 年前

    很明显的答案是,因为复合控件的流要求在某个时间点创建my childcontrols。我有一个问题,我想其他人也有。

    我的控件是一个复合的“容器/集合”控件。它将被馈送一个对象,并基于该对象数据创建多个ChildControl。因此,我的控件将呈现标题(始终)和x个,比如TextBox控件(基于它所接收的对象)。

    显然,我正在CreateChildControls()中创建我的标题,但是我不可能在那里创建我的文本框,因为我不知道(文本框所基于的)对象是否已经输入?我想公开一个属性/方法来设置/提供对象,但我不确定何时调用它。

    那我该怎么办?我的意思是我不可能在CreateChildControls()中创建文本框,或者我可以吗?我的意思是-当调用CreateChildControls()时-我知道我可以调用EnsureChildControls()(我已经在属性中这样做来设置标题的innerText-因为我需要在设置其innerText之前创建标题)。

    这个怎么样

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

    如果我将文本框的构建放在CreateChildControls()中,则会产生错误(或者最多不会创建任何文本框)。

    如果只将标头存储在成员变量中,从而不必在设置标头innerText的公开方法/属性中调用EnsureChildControls(),会更明智吗。我只是不太喜欢这个方法,因为它会增加额外的逻辑来临时存储,并且以后必须确定何时设置它(可能在PreRender中),从而使事情变得复杂。

    这真的应该是一个容易解决的任务-我知道我在某处遗漏了一些东西。。。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Stephen Wrighton    16 年前

    您所描述的是一个数据绑定控件。是的,它有点复杂,但它是这种类型实例的适当设计范例。

    也就是说,您是否考虑过使用中继器控件,而不是尝试推出您自己的行为完全相同的组合?与其给它传递一个随机对象,不如给它传递一个集合或一个包含所需文本区域数的iList。