1

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

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

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

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

我确信它非常简单,但我正在努力寻找有用的例子。

任何指针或想法表示赞赏!

干杯斯图尔特

4

2 回答 2

2

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

所以,为了避免你所有的头痛(哎呀,当我想到它时它已经开始受伤了:-P),这里有一些你绝对需要知道的信息。

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

模板

Chris 使用模板的建议是正确的方向。您的控件需要在某处存储 div 的“内容”,而模板是完美的解决方案。确保你一开始就做好了这部分。注意:如果模板属性有 set 子句,它们的行为可能会很奇怪!此外,还要检查 NotifyParentAttribute 的使用。

当您准备好模板,并且可以在 ASPX 页面中使用声明性语法来添加控件并且它们呈现良好时,您就可以开始使用设计器了。

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

简单的设计师解决方案

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

查看以下有关创建模板控件设计器的 MSDN 文章

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

复杂的设计师解决方案

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

请参阅EditableDesignerRegion 类中示例中的示例。

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

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

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

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

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

简而言之

因此,由您来决定标准模板编辑框架是否适合您。如果您想在 IDE 中为您的两个编辑区域提供精美的编辑功能,那么您将不得不实施复杂的解决方案。否则,只需坚持简单的实现。提到的例子会对你有很大帮助。

于 2009-05-19T03:30:35.920 回答
0

这是关于您正在尝试做什么的 MSDN 文章的链接,不幸的是没有 VS 设计器支持,因此它可以从服务器正确呈现,但不能在 IDE 中呈现。

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

于 2009-05-19T02:00:01.393 回答