首先准备一个空的ASP .NET网页。请将清单A的代码添加到HTML视图。
如你所见,我们添加了一个隐藏列,它用于存储每个记录的主键,以便以后能用数据做一些事情。这样就有了一个基本的DataGrid,但仍需向它发送数据。请切换到代码隐藏视图,添加清单B的代码。
对于这个例子,我们准备使用许多人都有的Northwind示例数据库来试着处理一些数据。为简化问题,我们打算从代码隐藏文件中直接调用数据库。但在实际的项目中,这种命令应该转移到数据访问层,以实现一个完全模块化的设计(我将在以后的文章里详细解释应用程序体系结构)。编译并运行这个页,就可看到一个基本的、没有任何修饰的DataGrid。
但在大多数实际应用中,用户并不满足只能看到数据;他们还需要操纵它。所以在清单C中,我们在网格的最后一列添加一个删除按钮,这要通过修改网格代码的<columns>小节来实现。
如你所见,这段代码使用的是含有按钮的一个模板列,而不是一个ButtonColumn。为什么呢?这纯粹是语义上的一种决策。以后如果愿意,可采取类似方式在列中添加更多的按钮,而且不必改写大量代码。当然,事实上两种方式都是可行的。
任何删除按钮都必须配套提供一个确认对话框,否则就不算完整。因此,请在代码隐藏文件中添加清单D的代码。
显然,除非实际创建按钮,否则无法用按钮做任何事情。另外,除非将行和数据绑定,否则按钮是不会创建的。所以,我们利用ItemDataBound事件来触发以上代码的添加。
在.NET框架中,使用Attributes集合的Add()方法,可非常容易地为几乎任何ASP .NET对象添加一个JavaScript命令。但在此之前,必须先在Controls集合中找到按钮。.NET框架再次提供了便利,这一次使用的是FindControl方法。使用CType函数,将变量l设置成当前项的按钮的实例,再对这个实例进行操作。
编译并运行这个网页。现在一旦单击删除按钮,就会弹出一个对话框,要求你确认删除请求。单击【取消】,回发(postback)事件就不会被触发。单击【确定】,表单就会被提交。但到目前为止,什么事情都不会发生,因为还没有编写事件处理程序。让我们修改一下代码隐藏文件,令其能对ItemCommand事件进行处理。
在清单E中,隐藏ID列标识出具体d需要删除的数据库项目。如前所述,实际的删除处理应包含在一系列单独的、用于数据访问的类中。此外,永远不要直接操作一个数据库,否则容易遭到SQL Injection攻击。
如果使用的只是一种类型的网格命令,那么ItemCommand已经足够。然而,如果想添加分页功能,局面就变得稍微有点复杂。不管使用的是默认还是自定义分页模式,页面链接实际都是LinkButton对象,它们以程序化的手段添加。这意味着它们可像其他任何LinkButton那样响应ItemCommand事件。在未来的文章里,我们准备更深入地探讨DataGrid,并研究如何实现不那么自动化的内置分页系统。
尽管配备删除按钮的DataGrid是一种经常都要用到的特性,但要想真正创建一个,并针对数据库执行命令,却需要一定的技巧。不过,为理解这些高级DataGrid技术而付出的代价是值得的。等你熟练之后,就会发现DataGrid是多么有用!