2010-01-25 30 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