Repeater里面的Gridview没有激活删除事件

时间:2009-09-11 21:03:31

标签: asp.net gridview repeater

我有一个带有gridview的Repeater,它使用带有delete命令的SqlDataSource。当我单击给定行上的删除时,它会回发但不会触发删除。我忘记了什么吗?

3 个答案:

答案 0 :(得分:2)

您是否设置了GridView的DataKeyNames property?需要将其设置为项的主键,以唯一标识要修改的记录。如果您没有设置它,单击删除(或编辑)将导致回传不会影响任何内容,因为DataKey没有与每个GridView行相关联。

根据GridView.DataKeys property页面:

  

当DataKeyNames属性是   设置,GridView控件   自动创建一个DataKey   对象中每一行的对象。   DataKey对象包含   字段或字段的值   在DataKeyNames中指定   属性。

例如,假设您要删除由ProductID字段标识的产品项。

您的SqlDataSource可能如下所示:

<asp:SqlDataSource ID="ProductsDataSource" runat="server"
ConnectionString="<%$ ConnectionStrings:NORTHWNDConnectionString %>"
SelectCommand= "SELECT [ProductID], [ProductName], [UnitPrice] FROM [Products]" 
DeleteCommand="DELETE FROM Products WHERE ProductID = @ProductID">
    <DeleteParameters>
      <asp:Parameter Name="ProductID" />
    </DeleteParameters>
</asp:SqlDataSource>

然后,您将为GridView的DataKeyNames属性分配相同的“ProductID”主键:

<asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"
        DataKeyNames="ProductID" ...

这些教程可能对您有所帮助:

答案 1 :(得分:1)

首先,您应该为明确的问题添加一些代码。任何试图帮助您的人都会要求您提供一些代码。

在我看来, *如果您使用Button,LinkButton,Image进行删除操作,可能会忘记使用 CommandName

在GridView列中声明的CommandField:

<asp:CommandField ShowDeleteButton="True" />

TemplateField可能是:

<asp:TemplateField>
   <ItemTemplate>
      <asp:LinkButton ID="lnkDelete" runat="server" CommandName="Delete" Text="Delete"/>
   </ItemTemplate>
</asp:TemplateField>

单击链接时,上述声明将具有相同的结果。检查您是否已成功分配CommandName属性。

*其他意见,如果你看详细的OnRowDeleting事件,如果你正在设置

e.Cancel = true //remove it

*你也在回发操作之间使用UpdatePanel吗?

答案 2 :(得分:1)

我刚刚建立了一个没有问题的基本示例。没有发布代码(正如许多其他人所要求的那样),我们可以帮助您。

以下是我的示例中的代码 - 这里没什么棘手的,只是将字符串数组绑定到转发器,并使用指定的select和delete命令将gridview绑定到sqldatasource。

我只能想到你的数据源没有指定删除命令/方法(但是你会得到一个明确的错误),或者你没有在gridview中指定DataKeyNames(但是你对此也有明确的错误。

<asp:Repeater ID="rp" runat="server">
<ItemTemplate>
<p>Row: <%#Container.DataItem%></p>

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" DataKeyNames="CroppingID">
    <Columns>
        <asp:CommandField ShowDeleteButton="True" />
        <asp:BoundField DataField="CroppingID" HeaderText="CroppingID" ReadOnly="True" SortExpression="CroppingID" />
        <asp:BoundField DataField="CroppingName" HeaderText="CroppingName" SortExpression="CroppingName" />
    </Columns>
</asp:GridView>

</ItemTemplate>
</asp:Repeater>

和数据源(来自我已设置的现有数据库)

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
    ConnectionString="<%$ ConnectionStrings:sConn %>" DeleteCommand="spD_Cropping" 
    DeleteCommandType="StoredProcedure" SelectCommand="spS_Croppings" 
    SelectCommandType="StoredProcedure">
    <DeleteParameters>
        <asp:Parameter Name="CroppingID" Type="Byte" />
    </DeleteParameters>
</asp:SqlDataSource>