【问题标题】:Asp.net GridView - Getting row identifierAsp.net GridView - 获取行标识符
【发布时间】:2013-07-02 11:27:30
【问题描述】:

我有一个在 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);
}

【问题讨论】:

  • 您能否详细说明“一切都出错了”。请问?
  • 我的意思是它处理了错误的行(删除错误的行,打开错误的顺序,...)。例如,如果我想删除第三行的订单 #123。如果页面加载后新订单到达,则删除错误的行(例如#124)。 (如果我在删除之前刷新页面,第三行会是什么)

标签: asp.net .net gridview


【解决方案1】:

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

假设 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 datakeys中获取主键:

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);
}

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

【讨论】:

    【解决方案2】:

    您应该设置 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));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多