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

0

这里没有任何代码示例,可以尝试...

假设 ID 是主键 - 您应该在 GridView DataKeys 属性中设置它。您不应将主键放置在可视区域中。

您指定 CommandArgument: 的地方应该是在 RowDataBound 事件中设置的行索引,这样:

//(note this is pseudo-code, but you should get the basic idea)
if( e.row.rowtype == datarow )
{
    Button btn = (Button) e.row.findcontrol("btnDelete") ;
    btn.CommandArgument = e.row.rowIndex ;
}

并在删除单击事件中从 gridview 数据键中获取主键:

protected void btnDelete_Click(object sender, CommandEventArgs e)
{
    int orderIDIdx = (Convert.ToInt32(e.CommandArgument);
    int pkey = Convert.ToInt32(Gridview1.Datakeys(orderIDidx).value

    da.DeleteOrder(pkey);

    Response.Redirect(Request.RawUrl, false);
}

显然,在适用的情况下添加适当的错误检查。

于 2013-07-02T12:40:43.217 回答
-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 回答