如何在里面创建一个包含2个Div的简单自定义容器控件?

时间:2009-05-18 14:57:09

标签: c# asp.net containers custom-controls

我希望创建一个自定义的ASP.NET容器控件,允许我在VS设计器中将更多控件拖入其中。

我正在寻找的最终HTML非常简单..

<div id="panel1">
    <div id="panel2">
    </div>
    <div id="panel2">
    </div>
</div>

可以将其他控件拖入面板2和3中。

我确信这很简单,但我很难找到有用的例子。

赞赏任何指示或想法!

干杯 斯图尔特

2 个答案:

答案 0 :(得分:2)

我过去做过这样的事情,是的,根据我当时的经验,没有太多可用的文档。更糟糕的是,当时有些文件不正确或含糊不清!

所以,为了省去你所有的麻烦(哎哟,当我想到它时它已经开始受伤了:-P),这里有一些你肯定需要知道的信息。

基本上所有控件仅供运行时使用。您可以将ControlDesigner附加到具有类定义属性的控件上,设计时环境(VS.NET IDE)将加载该控件并将其用作控件顶部的图层。

模板

Chris建议使用模板是正确的方向。您的控件需要存储div的“内容”,而模板是完美的解决方案。确保首先正确使用此部分。注意:如果模板属性具有set子句,则它们可能会表现得很奇怪!此外,还要检查NotifyParentAttribute的使用。

如果你已经有了模板,并且你可以在ASPX页面中使用声明性语法来添加控件,并且它们渲染得很好,那么你就可以开始设计设计师了。

对于设计师,您有2种选择;简单而复杂的方式。

简易设计师解决方案

让我们从简单的方式开始吧。基础ControlDesigner类已经提供了一个显示模板的框架。您可能已经看到了这一点,例如在GridView控件及其模板字段中。

查看以下MSDN article on creating a template control designer

通过这个简单的解决方案,您可以自动实现智能标记(设计时控件右侧的箭头),并可以从下拉列表中选择要编辑的模板。

复杂设计师解决方案

现在,如果这对您来说并不是真的令人满意,并且您希望能够像Panel控件一样编辑控件,那么您必须深入挖掘。所以这是使用控制设计器区域的复杂解决方案。

请参阅example in the EditableDesignerRegion class中的示例。

此示例的作用是覆盖设计器类的CreateChildControls。还记得我说设计器控件是运行时控件之上的一层吗?所以这个CreateChildControls方法将在你的控件实现之后运行。您需要做的是使用特殊的设计器区域HTML属性在渲染输出中标记HTML元素。通过这种方式,设计人员知道渲染控件中的哪个部分应该是一个区域。

现在您必须指示IDE为您的区域分配编辑器或查看器。您必须在GetDesignTimeHtml(DesignerRegionCollection区域)方法中执行此操作(请注意此方法的重载版本)。如您所见,此方法接收一组区域。您必须将可编辑的视图区域分配给此集合。这里重要的 - 这是记录严重的部分 - 这个集合中的顺序是非常重要的。 HTML中region属性的值是指此集合中的索引。

因此,现在我们在渲染输出中定义了区域,为其分配了编辑器或查看器。接下来是如何填充这些区域并将这些区域的值存储回控件声明。

这两个操作在控件设计器的GetEditableDesignerRegionContent和SetEditableDesignerRegionContent方法中处理。在这里,您可以了解为什么在GetDesignTimeHtml方法中为已添加到集合的区域命名。在这两种方法中,您将收到区域引用,并通过它的Name属性,您可以确定控件的哪个Template属性进行读/写。

要读取和写入模板属性,我们使用ControlPersister和ControlParser的魔力。 persister从声明性ASP.NET(HTML)代码创建模板实例。解析器以相反的方式完成工作;从模板实例创建纯HTML。

简而言之

因此,您可以自行决定标准模板编辑框架是否足够好。如果您希望在IDE中为两个编辑区域提供精美的编辑功能,则必须实施复杂的解决方案。否则只需坚持简单的实现。提到的例子对你有很大的帮助。

答案 1 :(得分:0)

以下是MSDN文章的链接,该文章介绍了您尝试执行的操作,不幸的是,没有VS设计器支持,因此它可以从服务器正确呈现,但不能在IDE中呈现。

如何:创建模板化的ASP.NET用户控件
http://msdn.microsoft.com/en-us/library/36574bf6.aspx