2010-10-12 69 views
0

我从来没有创建一个自定义的控制,所以除非考虑到这一点,这里是我的问题:开发使用嵌套中继器自定义Asp.net控制

是否有可能创建一个嵌套的中继器的自定义控制?

的用法是这样的:

<tag:NestedRepeater id="foo" runat="server" levels="6"/> 

我现在有相互嵌套的6个相同的中继器。然后我使用ItemDataBound事件来绑定绑定其子的孩子。在自定义控件中如何发生这种事件链?我希望能够拥有一个引用自身的中继器模板。那可能吗?

在试图做这件事之前,有什么明显的我可以忽略或应该知道吗?

回答

1

这当然是可能的,也很简单 - 您必须创建一个模板控件来接受页眉,页脚和项目模板。这就是我要做的

  1. 从Repeater继承我的控制它自我,这样我就不必为模板属性提供代码。

  2. 添加其他属性,如级别。还要添加一个属性,如NestedPlaceholderId,它会告诉我容器控制标识在哪儿嵌套子中继器。

  3. 覆盖诸如OnItemDataBound的方法以防止提高默认ItemDataBoundEvent。我的实现会引发一个自定义事件(比如NestedItemDataBound),它将通过事件参数属性传递当前的嵌套级别。期望消费者通过事件参数属性发送适当的数据源。

  4. 如果消费者提供数据源,然后使用NestedPlaceholderId来找到给定项目中的占位符。创建新的嵌套中继器并将其添加到占位符,将其模板设置为与当前模板相同,设置其事件处理程序,以便您可以对ItemDataBound事件进行冒泡并最终设置数据源并将其绑定。

所以,你可以使用语法使用控制等

<tag:NestedRepeater id="foo" runat="server" levels="6" NestedPlaceholderId="Nested"> 
    <ItemTemplate> 
    <p> 
      <span>[some data binding expression]</span> 
      <div class="nested"> 
       <asp:PlaceHolder runat="server" ID="Nested" /></li> 
      </div> 
     </p> 
    </ItemTemplate> 
</tag:NestedRepeater>