0

私はグリッドビューをフォローしています:

<asp:Panel ID="pnlScroll" runat="server" ScrollBars="Auto">
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <asp:GridView ID="GVCart2" runat="server" AutoGenerateColumns="False" GridLines="Vertical" onrowcommand="CartUpdate">
                <AlternatingRowStyle BackColor="#CCCCCC" />
                <Columns>
                    <asp:BoundField DataField="Product_Name" HeaderText="Product Name" />
                    <asp:BoundField DataField="Product_ID" HeaderText="Product ID" />
                    <asp:BoundField DataField="ItemQTY" HeaderText="ItemQTY" />
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:Button ID="IncreaseCartQty" runat="server" CommandArgument="<%#((GridViewRow)Container).RowIndex %>" CommandName="IncreaseCartQty" Text="+" />
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="Price" HeaderText="Price" />
                    <asp:BoundField DataField="TotalPrice" HeaderText="TotalPrice" />
                </Columns>
                <FooterStyle BackColor="#CCCCCC" />
                <HeaderStyle BackColor="Black" Font-Bold="True" ForeColor="White" />
                <PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
                <SelectedRowStyle BackColor="#000099" Font-Bold="True" ForeColor="White" />
                <SortedAscendingCellStyle BackColor="#F1F1F1" />
                <SortedAscendingHeaderStyle BackColor="#808080" />
                <SortedDescendingCellStyle BackColor="#CAC9C9" />
                <SortedDescendingHeaderStyle BackColor="#383838" />
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>
    </asp:Panel>

グリッドビューには、アイテムの量を増やすためのボタンが 1 つあります。ボタンのコマンド名は"IncreaseCartQty"です。OnRowCommand "CartUpdate"を呼び出そうとしています。しかし問題は、OnRowCommandイベントが発生しないことです。

コードの背後にあるページは次のとおりです。

ページの読み込み時:

 protected void Page_Load(object sender, EventArgs e)
    {
      if (Session["ItemsCount"] != null)
      {
       CartDT = (DataTable)Session["cart"];
       GVCart2.DataSource = CartDT;
       GVCart2.DataBind();
      }
    }

gridview OnRowCommand で呼び出したい関数は次のとおりです。

public void CartUpdate(object sender, GridViewCommandEventArgs e)
        {
            CartDT = (DataTable)Session["cart"];
            if (e.CommandName == "IncreaseCartQty")
            {
                DataRow DR = CartDT.NewRow();
                int rowIndex = Convert.ToInt32(e.CommandArgument.ToString());
                int qty = Convert.ToInt32(CartDT.Rows[rowIndex][2].ToString());
                DR[0] = CartDT.Rows[rowIndex][0];
                DR[1] = CartDT.Rows[rowIndex][1];
                DR[2] = ++qty;
                DR[3] = CartDT.Rows[rowIndex][3];
                DR[4] = qty * double.Parse(CartDT.Rows[rowIndex][3].ToString());
                CartDT.Rows.RemoveAt(rowIndex);
                CartDT.Rows.InsertAt(DR, rowIndex);
                CartDT.AcceptChanges();
                Session["cart"] = CartDT;
                GVCart2.DataSource = CartDT;
                GVCart2.DataBind();
                TotalOrderAmt();
                TotalItemsCount();
            }

        }

注文金額とアイテム数を計算する関数は次のとおりです。

 public void TotalOrderAmt()
        {
            double t = 0;
            for (int i = 0; i < CartDT.Rows.Count; i++)
            {
                t = t + double.Parse(CartDT.Rows[i][4].ToString());
            }

            Session["TotalOrderAmt"] = t;
        }

        public void TotalItemsCount()
        {
            double t = 0;
            for (int i = 0; i < CartDT.Rows.Count; i++)
            {
                t = t + double.Parse(CartDT.Rows[i][4].ToString());
            }

            Session["ItemsCount"] = t;
        }

OnRowCommandイベントが発生しない理由がわかりません。グリッドビューでボタンをクリックしても何も起こりません。

正確にどこが間違っているか教えてください。

4

1 に答える 1

1

あなたが抱えている問題は、ページの読み込み方法にあります。Ispostback メソッドが必要だからです。

それを置き換えます(以下のコードを参照)

 protected void Page_Load(object sender, EventArgs e)
    {
      if (Session["ItemsCount"] != null)
      {
       CartDT = (DataTable)Session["cart"];
       GVCart2.DataSource = CartDT;
       GVCart2.DataBind();
      }
    }

そのために(以下のコードを参照)

 protected void Page_Load(object sender, EventArgs e)
    {
      if (!IsPostBack)
      {
        if (Session["ItemsCount"] != null)
        {
         CartDT = (DataTable)Session["cart"];
         GVCart2.DataSource = CartDT;
         GVCart2.DataBind();
        }
      }
    }

メソッドを使用しない場合!Ispostback、エラーがスローされ、Onrowcommand 引数は実行されません。

それが役立つことを願っています。

編集:

詳細については、グリッド上の無効なポストバック

于 2013-05-27T14:46:18.460 に答える