让所有新事件协同工作的窍门在于,将Delete按钮的命令处理和内建的DeleteCommand事件联系起来。我刚开始认为该事件是在一个可编辑的DataGrid中和处理命令联系的,但稍后发现,DeleteCommand事件只是一个占位符事件,不和任何内部的删除操作相联系。所以,你可用它联系和处理自定义删除事件。
首先将LinkButton的CommandName变成Delete,并在<asp:datagrid>标记中添加一个OnDeleteCommand属性。这些改动如清单A所示。切换到代码隐藏文件,并进行如清单B所示的修改。编译并运行这个页。现在就会发现,删除处理将不再依赖ItemCommand事件,这就为处理PageIndexChanged事件铺平了道路。
为了使我们的分页控件能正常工作,需要处理PageIndexChanged事件并添加一些代码。我觉得这一部分是最容易使人困惑的。就我看来,DataGrid应该内在地处理它,因为在任何情况下,代码都不会改变。由于微软把它称为“内建”分页,所以单击“内建”分页控件时,用于更改页的处理程序也应该是内建的。在将来的一篇文章中,我将解释如何将这个功能封装到一个自定义DataGrid控件中。就目前来说,解决方案非常简单。请添加清单C的代码来处理事件和联系分页控件。
来看看子程序的参数。处理.NET框架的内建事件时,事件处理程序一般需要两个参数:sender和e。其中,sender参数表示调用子程序的那个对象,而e是EventArgs类的一个实例或派生类,其中含有和事件有关的其他信息,处理程序可能需要用到这些信息。在这个例子中,e包含了更改Grid的当前页所需的一切。
至此,我们的DataGrid已经完成了。编译和执行页,会看到一切都很顺利。单击来切换不同的页,你会看到页的变化非常正常。不过,现在请跳转到最后一个页,开始删除页上的所有记录。删除页上的最后一行后,注意会发生什么。
应该产生一个PageIndex错误。我花了一个多小时的时间来测试代码,琢磨各种问题,并试验各种解决方案,但都徒劳而返。经过一段时间的休整后,我突然知道这其实是一个非常简单的问题,而我居然没有更早地想到它。另外,我还十分吃惊地发现没有任何资料在讨论这个问题(这正是写作本文的一个主要动机)。