Evil 域

当Evil遇上先知

导航

做一个带确认对话框的批量删除GridView

Posted on 2007-05-10 23:29  Saar  阅读(1688)  评论(8编辑  收藏  举报
    我们在邮件系统里,经常会用到批量删除邮件的功能,并且在点击删除按钮的时候,还会弹出一个确认对话框。利用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",界面部分就大功告成了,代码片段如下:

<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" />

    然后,我们需要为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属性相同。
    接下来,就要处理删除按钮的事件了。双击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值,便可以实现确认删除功能:
    改写第一块HTML代码的最后一行如下:
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" OnClientClick='return confirm("Hello! PostBack. Yes or No?")'
        Text
="Button" />

    一个带确认对话框的批量删除记录的GridView就做好了。如果大家还有更好的方法,欢迎留言交流。