Gridview внутри Repeater не запускает Удалить событие - PullRequest
1 голос
/ 12 сентября 2009

У меня есть Repeater с сеткой, который использует SqlDataSource с командой delete. Когда я нажимаю «Удалить» в заданной строке, он отправляет сообщение обратно, но не запускает удаление. Я что-то забыл?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2009

Вы установили свойство DataKeyNames GridView ? Он должен быть установлен на первичный ключ элемента, чтобы однозначно идентифицировать запись для изменения. Если вы не установили его, нажатие кнопки «Удалить» (или «Редактирование») вызовет обратную передачу, которая ни на что не повлияет, поскольку DataKey не был связан с каждой строкой GridView.

Согласно свойству GridView.DataKeys страница:

Когда свойство 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>

Затем вы бы присвоили тот же первичный ключ "ProductID" свойству DataKeyNames GridView:

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

Эти учебники могут быть вам полезны:

1 голос
/ 28 сентября 2009

Я только что создал очень простой пример без проблем. Без публикации кода (как просили многие) мы не сможем вам помочь.

Вот код из моего примера - здесь нет ничего сложного, просто привязал строковый массив к повторителю и привязал вид сетки к sqldatasource с указанными командами выбора и удаления.

Все, что я могу думать, это то, что в вашем источнике данных не указана команда / метод удаления (но вы получите явную ошибку по этому поводу), или что у вас нет 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>
1 голос
/ 23 сентября 2009

Прежде всего, вы должны добавить код для ясных вопросов. Любой, кто попытается помочь вам, попросит вас ввести код.

На мой взгляд, * если вы используете Button,LinkButton,Image для операций удаления, возможно, вы забыли использовать CommandName

CommandField, который объявлен в столбцах GridView:

<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 между операциями обратной передачи ??

...