2

GridView で注文を表示するページがあり、各行には詳細ボタンと削除ボタンがあります。ほとんどの場合、すべて正常に動作しますが、ページの更新とボタンのクリックの間に新しい注文が到着すると、間違った注文が処理されます。

一意の識別子を CommandArgument に保存しますが、問題の識別子はサーバーに返されず、代わりにある種のカウンター (たとえば 5 番目の注文) に渡され、新しい注文の到着後、正しいものは 6 番目になるため、すべてうまくいかない...どうしたの?

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" PageSize="20" 
    EnableViewState="False" EnableSortingAndPagingCallbacks="True" 
    DataSourceID="ldsOrders" AllowPaging="True" 
    ondatabound="gvOrders_DataBound" CssClass="Gridview" >
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" InsertVisible="False" 
            ReadOnly="True" SortExpression="ID" />

        <asp:TemplateField>
            <ItemTemplate>
                <asp:Button ID="btnDelete" runat="server" CommandArgument='<%#Eval("ID") %>' CommandName="Delete"
                    Text="Delete" OnClick="btnDelete_Click" CausesValidation="False" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                  <asp:Button ID="btnOrder" runat="server" CommandArgument='<%#Eval("ID") %>' CommandName="Order"
                    Text="Order" OnCommand="btnOrder_Click" CausesValidation="False" />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

コード ビハインド:

protected void btnDelete_Click(object sender, CommandEventArgs e)
{
    string orderID = (string)e.CommandArgument;
    da.DeleteOrder(Convert.ToInt32(orderID));
    Response.Redirect(Request.RawUrl, false);
}
4

2 に答える 2

-1

DataKeyNames http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.datakeynames.aspxを設定する必要があります

<asp:GridView ID="Gridview1" DataKeyNames="ID" .... >

次に、コマンド delete が RowDeleting イベントをトリガーします

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.rowdeleting.aspx

これは、e.Keys[0] を使用して行を削除し、ID を取得するために使用できます。

protected void Gridview1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
    Int orderID = Convert.ToInt32(e.Keys[0].ToString());
    da.DeleteOrder(Convert.ToInt32(orderID));
}
于 2013-07-02T12:59:01.027 に答える