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