下面是为测试复合控件compositeevent而创建的default.aspx文件代码。
<%@ page language="c#" autoeventwireup="true" codefile="default.aspx.cs" inherits="_default" %>
<%@ register tagprefix="sample" assembly="webcontrollibrary" namespace="webcontrollibrary" %>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<script runat="server">
void demo1_submit(object sender, eventargs e) {
lbmessage.text = "您刚才输入的是:" + demo1.text;
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head1" runat="server">
<title>为复合控件实现事件-包含法</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<sample:compositeevent id="demo1" runat="server" buttontext="提交" onsubmit="demo1_submit" />
<br />
<asp:label id="lbmessage" runat="server"></asp:label>
</div>
</form>
</body>
</html>
示例效果如图1所示。

图1 效果图
在以上应用中,当用户单击"提交"按钮之后,将引发demo1_submit处理程序的执行,由此显示文本框输入内容。
需要读者注意的是其内部执行过程。控件定义的顶层事件是submit,其对应事件处理程序是onsubmit,而不是_button_click。_button_click是复合控件的子控件的click事件处理程序。由于在控件实现的代码中定义了子控件的事件处理程序_button_click,所以,当用户单击按钮后,将首先执行_button_click,该方法要求调用顶层事件submit的事件处理程序onsubmit。从外部来看,子控件的事件即暴露为顶层事件。
从以上实现过程来看,包含法使用的是程序代码上的小技巧来实现事件上传功能。下面介绍的冒泡法则与此不同,它使用.net框架提供的事件上传机制来完成子控件的事件上传。