【问题标题】:Why should I create my child controls in CreateChildControls() on a CompositeControl?为什么要在 CompositeControl 上的 CreateChildControls() 中创建子控件?
【发布时间】:2008-12-29 21:59:33
【问题描述】:

好吧,显而易见的答案是,因为复合控件的流程要求在某个时间点创建我的子控件。我遇到了一个我认为其他人一定也遇到过的问题。

我的控件是一个复合的“容器/集合”控件。它将被提供一个对象,并基于该对象数据创建许多子控件。所以我的控件将呈现一个标题(总是)和 x 数,比如 TextBox 控件(基于它所提供的对象)。

显然,我在 CreateChildControls() 中创建了我的标题,但我也无法在那里创建我的 TextBox,因为我不知道对象(作为 TextBox 的基础)是否已经被输入?我想过公开一个属性/方法来设置/提供对象,但我不确定它什么时候会被调用。

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

这个怎么样

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

如果我将文本框的构建放在 CreateChildControls() 中,那将引发错误(或充其量不会创建任何文本框)。

将 Header 存储在成员变量中会不会更明智,因此不必在设置 Header 内部文本的公开方法/属性中调用 EnsureChildControls()。我只是不太喜欢这种方法,因为它会通过添加额外的逻辑来临时存储并且稍后必须弄清楚何时设置它(可能在 PreRender 中),这会使事情变得复杂。

另外我想我可以制作某种数据绑定控件,确保在调用 .DataBind() 时数据存在。我真的不喜欢这个,因为上次我研究了创建数据绑定控件,它变得非常复杂。

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

【问题讨论】:

    标签: asp.net composite-controls


    【解决方案1】:

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

    也就是说,您是否考虑过使用中继器控件,而不是尝试推出自己的复合材料,它的行为方式完全相同?与其传递一个随机对象,不如传递一个集合或 iList 以及您想要的文本区域数。

    【讨论】:

    • 你有几点:)我想我会尝试中继器方法,然后再回来:)
    • 好的,Repeater 方法有问题。我需要一个用于中继器的 ItemTemplate,我只有一个代码隐藏文件。
    • 我传递的对象也不是随机的。它(除其他外)包含我从服务层获得的 IEnumerable 。该对象上还有更多属性,我需要使用这些属性来“设置”我的容器控件。
    • 您可以生成一个可以在这种情况下使用的 ItemTemplate 类:msdn.microsoft.com/en-us/library/aa479322.aspx
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2010-12-13
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多