为了解释如何在用户控件所封装的行为中使用事件,我先演示一下如何建立一个基于网络的、数据驱动的(data-driven)商务应用程序,该程序包括若干个页面,用户可以通过它们来返回项目清单、用户对个人项目的选择以及编辑项目详细资料。这个功能相当简单,也是绝大多数商业应用程序都有的。无论你选择哪一种方法来实现,一个网页的功能都应该可以被其它网页所重用。
用户控件是网页的一部分,它有自己的HTML元素以及与之相关的代码。你可以通过放置通用用户控件来快速建立网页,然后用代码把它们整合起来。在我给出的例子中,它在逻辑上可以清晰的分成三个部分:
我将通过举例来演示这个技巧。在这个简单的应用程序中,我将允许用户从雇员(Employees)表中返回一个雇员清单。这个程序提供给用户一个页面,该页面包含了一个DataGrid控件,该控件显示雇员列表,用户可以从中选择某个特定的雇员,该页面就会显示一个有关此雇员的详细信息的表单。该表单有两个按钮:一个用来向数据库提交对雇员信息的改动(“提交”按钮),另一个用来取消对数据库的更新(“取消”按钮)。
Employees.aspx页的Page_Load事件(为了简短起见,我在这里就不详细讨论该事件了)用来设置用户控件的初始状态。由于我希望对某个特定雇员的选择发生在显示该雇员详细信息之前,所以EmployeeList.ascx控件的初始值设定为可见(visible),而EmployeeDetails.ascx控件的初始值则设定为不可见。后者在用户选定某特定雇员之前一直保持不可见状态,对雇员的选择发生在EmployeeList.ascx中的DataGrid控件之中。为了显示初始视图,Page_Load事件把EmployeeList.ascx控件的属性设定为合适的值,然后调用EmployeeList.GetEmployees。GetEmployees方法返回一个填充了雇员信息(从数据库)的DataSet,然后该DataSet绑定到名为EmployeeGrid的DataGrid上。
理想情况下,雇员列表和用户选定的雇员的详细信息应该显示在同一个表单中。然而,用于编辑雇员详细信息的表单是一个独立的用户控件,这样,这该如何实现?这就是.NET事件功能大显身手的地方了。