ASP.NET自定义控件 第四天 折叠面板自定义控件2011-09-02 博客园 holywolf1. 引言在前几次任务里我们开发一个星级控件并逐渐为其增加一新的特性,在本次任 务里,我们将开发一个较复杂的自定义控件,该自定义控件需要实现折叠面板的 功能。用户可以向面板控件中自由添加控件,该控件呈现出来后会根据用户设置 决定是否显示折叠按钮,如果允许则用户可以点击按钮展开/折叠按钮以显示或隐 藏面板,并且可以在服务器端捕捉到展开/折叠事件以进行更多的控制,该控件运 行效果图如下:

2. 分析我们在确定该控件最终能够使用HTML呈现出来之后,接下来要考虑的是为该自 定义控件选择一个合适的基类。从要实现的功能来看,该控件分为两部分,一部 分是包含展开/折叠按钮的标题行,另一部分是包含用户放置按钮的容器,很显然 这个容器我们可以使用Panel类,为了保留用户直接定义Panel中子标记的特性, 使自定义控件直接继承自Panel类,根据设置决定是否显示标题行,并且根据面板 状态显示恰当的展开或折叠图标。由于Panel可以看作一个容器控件,那么当页面上使用多个该控件时会产生什 么样的结果,容器中的子控件还能保证是唯一的吗?可以尝试编写一个继承自 Panel类的自定义控件CustomerControl并向其控件集合(Controls属性)中添加 一个ID为txt的文本框,当在页面上放置两个这样的自定义控件时会生成了两个文 本框(毫无疑问,因为是两个自定义控件),但是它们的id属性均为txt,类似于 以下代码:
<span id="cc1"><input name="txt" type="text" id="txt" /></span><span id="cc2"><input name="txt" type="text" id="txt" /></span>
为了避免这种情况发生,只需要使CustomerControl类实现INamingContainer 接口,再次预览页面,将会发现生成的文本框已经具有唯一的id了:
<span id="cc1"><input name="cc1$txt" type="text" id="cc1_txt" /></span><span id="cc2"><input name="cc2$txt" type="text" id="cc2_txt" /></span>