Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建一个包含2个div的简单自定义容器控件?_C#_Asp.net_Containers_Custom Controls - Fatal编程技术网

C# 如何创建一个包含2个div的简单自定义容器控件?

C# 如何创建一个包含2个div的简单自定义容器控件?,c#,asp.net,containers,custom-controls,C#,Asp.net,Containers,Custom Controls,我想创建一个自定义ASP.NET容器控件,允许我在VS设计器中将更多控件拖动到其中 我要找的最后一个HTML非常简单 <div id="panel1"> <div id="panel2"> </div> <div id="panel2"> </div> </div> 可以将其他控件拖动到面板2和3中 我相信这很简单,但我很难找到有帮助的例子 任何指点或想法都将不胜感激 干杯 Stuart

我想创建一个自定义ASP.NET容器控件,允许我在VS设计器中将更多控件拖动到其中

我要找的最后一个HTML非常简单

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

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

我相信这很简单,但我很难找到有帮助的例子

任何指点或想法都将不胜感激

干杯
Stuart

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

如何:创建模板化的ASP.NET用户控件

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

所以,为了避免你所有的头痛(哎哟,当我一想到它就已经开始痛了:-p),这里有一些你肯定需要知道的信息

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

模板 Chris关于使用模板的建议是正确的。您的控件需要将div的“内容”存储在某个地方,模板是完美的解决方案。首先要确保你把这个零件弄对了。注意:如果模板属性有一个set子句,那么它们的行为可能会很奇怪!此外,还要检查NotifyParentAttribute的使用

当模板就位后,可以在ASPX页面中使用声明性语法添加控件,并且这些控件呈现良好,然后就可以开始使用设计器了

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

简易设计器解决方案 让我们从简单的方法开始。基础ControlDesigner类已经提供了一个显示模板的框架。您可能已经看到了这一点,比如在GridView控件及其模板字段中

查看以下内容

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

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

请参见中的示例

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

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

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

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

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

简而言之 因此,由您决定标准模板编辑框架是否适合您。如果希望IDE中的两个编辑区域都具有奇特的编辑功能,则必须实现复杂的解决方案。否则,只需使用简单的实现即可。上面提到的例子会对你有很大帮助