我们在邮件系统里,经常会用到批量删除邮件的功能,并且在点击删除按钮的时候,还会弹出一个确认对话框。利用ASP.NET 2.0的新特性,可以很方便的实现类似的功能。方法如下:
首先,添加一个GridView到页面中,并且,添加一个ObjectDataSource,以绑定数据。完成以后,点击GridView的smart tag上的“Edit Columns...”(编辑列),添加一个模板列Column[0]。编辑模板列,在Column[0]的ItemTemplate和HeaderTemplate里各添加一个CheckBox控件,并分别命名为"cbSelect"和"cbSelectAll"。然后,设置cbSelectAll的AutoPostback属性为True。再往界面里添加一个Button控件,命名为"btnDelete",界面部分就大功告成了,代码片段如下:
然后,我们需要为cbSelectAll添加一个事件处理,当它被点击时,把其它所有行的CheckBox都选上。编辑模板列,显示cbSelectAll并双击,在后置代码页添加事件处理:
接下来,就要处理删除按钮的事件了。双击btnDelete,添加Click事件处理:
改写第一块HTML代码的最后一行如下:
一个带确认对话框的批量删除记录的GridView就做好了。如果大家还有更好的方法,欢迎留言交流。
首先,添加一个GridView到页面中,并且,添加一个ObjectDataSource,以绑定数据。完成以后,点击GridView的smart tag上的“Edit Columns...”(编辑列),添加一个模板列Column[0]。编辑模板列,在Column[0]的ItemTemplate和HeaderTemplate里各添加一个CheckBox控件,并分别命名为"cbSelect"和"cbSelectAll"。然后,设置cbSelectAll的AutoPostback属性为True。再往界面里添加一个Button控件,命名为"btnDelete",界面部分就大功告成了,代码片段如下:
<h2>Confirm and Delete MultiProducts</h2>
<asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="AllProductsDataSource">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="cbSelectAll" runat="server" AutoPostBack="True" OnCheckedChanged="cbSelectAll_CheckedChanged" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="cbSelect" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName" ReadOnly="True"
SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="SupplierName" ReadOnly="True"
SortExpression="SupplierName" />
<asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" SortExpression="QuantityPerUnit" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="AllProductsDataSource" runat="server" DeleteMethod="DeleteProduct"
OldValuesParameterFormatString="{0}" SelectMethod="GetProducts" TypeName="ProductsBLL">
<DeleteParameters>
<asp:Parameter Name="productID" Type="Int32" />
</DeleteParameters>
</asp:ObjectDataSource>
<asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_Click" />
<asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False" DataKeyNames="ProductID" DataSourceID="AllProductsDataSource">
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="cbSelectAll" runat="server" AutoPostBack="True" OnCheckedChanged="cbSelectAll_CheckedChanged" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="cbSelect" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="ProductName" HeaderText="ProductName" SortExpression="ProductName" />
<asp:BoundField DataField="CategoryName" HeaderText="CategoryName" ReadOnly="True"
SortExpression="CategoryName" />
<asp:BoundField DataField="SupplierName" HeaderText="SupplierName" ReadOnly="True"
SortExpression="SupplierName" />
<asp:BoundField DataField="QuantityPerUnit" HeaderText="QuantityPerUnit" SortExpression="QuantityPerUnit" />
<asp:BoundField DataField="UnitPrice" HeaderText="UnitPrice" SortExpression="UnitPrice" />
<asp:CheckBoxField DataField="Discontinued" HeaderText="Discontinued" SortExpression="Discontinued" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="AllProductsDataSource" runat="server" DeleteMethod="DeleteProduct"
OldValuesParameterFormatString="{0}" SelectMethod="GetProducts" TypeName="ProductsBLL">
<DeleteParameters>
<asp:Parameter Name="productID" Type="Int32" />
</DeleteParameters>
</asp:ObjectDataSource>
<asp:Button ID="btnDelete" runat="server" Text="Delete" OnClick="btnDelete_Click" />
然后,我们需要为cbSelectAll添加一个事件处理,当它被点击时,把其它所有行的CheckBox都选上。编辑模板列,显示cbSelectAll并双击,在后置代码页添加事件处理:
protected void cbSelectAll_CheckedChanged(object sender, EventArgs e)
{
foreach (GridViewRow gvr in gvProducts.Rows)
{
((CheckBox)gvr.Cells[0].FindControl("cbSelect")).Checked = ((CheckBox)sender).Checked;
}
}
这个foreach让gvr依次指向GridView的每一行,找出cbSelect控件,并使其Checked属性与sender的Check属性相同。{
foreach (GridViewRow gvr in gvProducts.Rows)
{
((CheckBox)gvr.Cells[0].FindControl("cbSelect")).Checked = ((CheckBox)sender).Checked;
}
}
接下来,就要处理删除按钮的事件了。双击btnDelete,添加Click事件处理:
protected void btnDelete_Click(object sender, EventArgs e)
{
ProductsBLL productsLogic = new ProductsBLL();
Response.Write("<script language='javascript'>alert('Deleting')</script>");
foreach (GridViewRow gvr in gvProducts.Rows)
{
if (((CheckBox)gvr.Cells[0].FindControl("cbSelect")).Checked) //此行cbSelect被勾选
{
Northwind.ProductsRow row = (Northwind.ProductsRow)((DataRowView)gvr.DataItem).Row;//获取相应的强类型DataRow
productsLogic.DeleteProduct(row.ProductID);
}
}
}
这样,批量删除的功能就实现了。我们离终点还有一小步:添加提示对话框,在ASP.NET 2.0里,只要实现IButton接口的对象,都引入了一个新的属性:OnClientClick。只要设置此属性利用JavaScript的confirm()方法返回一个bool值,便可以实现确认删除功能:{
ProductsBLL productsLogic = new ProductsBLL();
Response.Write("<script language='javascript'>alert('Deleting')</script>");
foreach (GridViewRow gvr in gvProducts.Rows)
{
if (((CheckBox)gvr.Cells[0].FindControl("cbSelect")).Checked) //此行cbSelect被勾选
{
Northwind.ProductsRow row = (Northwind.ProductsRow)((DataRowView)gvr.DataItem).Row;//获取相应的强类型DataRow
productsLogic.DeleteProduct(row.ProductID);
}
}
}
改写第一块HTML代码的最后一行如下:
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" OnClientClick='return confirm("Hello! PostBack. Yes or No?")'
Text="Button" />
Text="Button" />
一个带确认对话框的批量删除记录的GridView就做好了。如果大家还有更好的方法,欢迎留言交流。
Little knowledge is dangerous.