网格视图行命令在每次单击后触发

时间:2013-11-16 08:28:31

标签: c# asp.net gridview user-controls

我在网格视图中购物车。网格位于更新面板中,更新模式始终为。网格视图本身位于用户控件中,此用户控件呈现在子页面中(GridView - > User Control - > Child aspx page - > master page)。每当我点击任何按钮修改购物车时,gridview row命令不会第一次触发,但是当我第二次再次点击按钮时,行命令会正确触发。现在我不知道为什么 行命令事件 在第一次点击时没有触发, 它只在每次偶数点击时触发(第二次点击)

ASP:

<asp:GridView ID="GVCart" runat="server" AutoGenerateColumns="False" OnRowCommand="CartUpdate">
    <Columns>
        <asp:BoundField DataField="Product_Name" HeaderText="Product Name">               
        </asp:BoundField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:ImageButton ID="Button3" runat="server" CommandArgument='<%# Eval("Product_ID") %>'
                    CommandName="DecreseCartQty" Height="20px" ToolTip="Minus" AlternateText="+" />
                <asp:ImageButton ID="ImageButton1" runat="server" CommandArgument='<%# Eval("Product_ID") %>'
                    CommandName="IncreaseCartQty" Height="20px" ToolTip="Add" AlternateText="-" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:Label ID="ABC" runat="server" Text='<%# Eval("ItemQTY")+" * "+Eval("Price")+" = "+Eval("TotalPrice") %> '></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:ImageButton ID="Button4" runat="server" CommandArgument='<%# Eval("Product_ID") %>' CommandName="Remove" ToolTip="Cancel"/>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

C#:(在用户控制中)

protected void CartUpdate(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "IncreaseCartQty")
            {

                int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
                DataTable CartDT = (DataTable)Session["cart"];

                for (int i = 0; i < CartDT.Rows.Count; i++)
                {
                    if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
                    {
                        CartDT.Rows[i]["ItemQTY"] = Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]) + 1;
                        CartDT.Rows[i]["TotalPrice"] = Convert.ToInt32(CartDT.Rows[i]["Price"]) * Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]);
                        //Page.Response.Redirect(Page.Request.Url.ToString(), true);
                    }
                }



            }
            if (e.CommandName == "DecreseCartQty")
            {
                int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
                DataTable CartDT = (DataTable)Session["cart"];

                for (int i = 0; i < CartDT.Rows.Count; i++)
                {
                    if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
                    {
                        if (Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]) > 1)
                        {
                            CartDT.Rows[i]["ItemQTY"] = Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]) - 1;
                            CartDT.Rows[i]["TotalPrice"] = Convert.ToInt32(CartDT.Rows[i]["Price"]) * Convert.ToInt32(CartDT.Rows[i]["ItemQTY"]);
                           // Page.Response.Redirect(Page.Request.Url.ToString(), true);
                        }

                    }
                }

            }
            if (e.CommandName == "Remove")
            {
                int ProductId = Convert.ToInt32(e.CommandArgument.ToString());
                DataTable CartDT = (DataTable)Session["cart"];

                for (int i = 0; i < CartDT.Rows.Count; i++)
                {
                    if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
                    {
                        CartDT.Rows.RemoveAt(i);
                        //Page.Response.Redirect(Page.Request.Url.ToString(), true);
                    }
                }
            }
        }

谁能告诉我我在做什么错。你的回答对我很有帮助。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

行为正常。您应该在购物车更新后绑定gridview,以便不需要其他回发。

之后添加这些行
if (e.CommandName == "Remove")
{
    int ProductId = Convert.ToInt32(e.CommandArgument.ToString());        
    DataTable CartDT = (DataTable)Session["cart"];

    for (int i = 0; i < CartDT.Rows.Count; i++)
    {
        if (CartDT.Rows[i]["Product_ID"].ToString() == ProductId.ToString())
        {
            CartDT.Rows.RemoveAt(i);
            //Page.Response.Redirect(Page.Request.Url.ToString(), true);
        }
    }
}
DataTable CartDT = (DataTable)Session["cart"];
gridview1.datasource=CartDT ;
gridview1.databind();

答案 1 :(得分:0)

Checkout this回答,我认为它会解决您的问题。如果您在用户控制中有网格视图,则可能会出现此问题。当我在用户控件中使用网格视图时,我遇到了同样的问题。