0

こんにちは、私は学校のプロジェクトをやっていて、問題に行き詰まっています。

ユーザーが何らかの理由で数量の値を変更できるテキスト ボックスの数量を持つショッピング カート グリッドビューがあります。古い値だけで新しい値が取得されません。ありがとうございます!

<div class="container">
            <h1>Shopping Cart</h1>
            <a href="Default.aspx">&lt; Back to Products</a>
            <br /><br />
        <asp:Label ID="Label2" runat="server" ></asp:Label>
        <asp:Label ID="Label3" runat="server" ></asp:Label>
            <asp:GridView runat="server" ID="gvShoppingCart" AutoGenerateColumns="false" EmptyDataText="There is nothing in your shopping cart." GridLines="None" Width="100%" CellPadding="5" ShowFooter="true" DataKeyNames="ProductID" OnRowDataBound="gvShoppingCart_RowDataBound" OnRowDeleting="grdCart_RowDeleting" >
                <HeaderStyle HorizontalAlign="Left" BackColor="#3D7169" ForeColor="#FFFFFF" />
                <FooterStyle HorizontalAlign="Right" BackColor="#6C6B66" ForeColor="#FFFFFF" />
                <AlternatingRowStyle BackColor="#F8F8F8" />
                <Columns>
                    <asp:BoundField DataField="ProductName" HeaderText="Brand" />
                    <asp:TemplateField HeaderText="Quantity">
                        <ItemTemplate>
                            <asp:TextBox runat="server" ID="txtQuantity" Columns="5" Text='<%# Eval("Quantity") %>'></asp:TextBox><br />                            
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="Price" HeaderText="Price" ItemStyle-HorizontalAlign="Right" HeaderStyle-HorizontalAlign="Right" DataFormatString="{0:C}"  />
                    <asp:BoundField DataField="SubTotal" HeaderText="Total" ItemStyle-HorizontalAlign="Right" HeaderStyle-HorizontalAlign="Right" DataFormatString="{0:C}" />
                    <asp:CommandField ShowDeleteButton="True" />
                </Columns>
            </asp:GridView>
            <br />
            <asp:Button runat="server" ID="btnUpdateCart" Text="Update Cart" OnClick="btnUpdateCart_Click" /><br />
            <asp:Button ID="btnClose2" runat="server" Text="Close" Width="50px" />
        </div>

コードビハインド

protected void btnUpdateCart_Click(object sender, EventArgs e)
    {
        foreach (GridViewRow row in gvShoppingCart.Rows)
        {
            if (row.RowType == DataControlRowType.DataRow)
            {
                // We'll use a try catch block in case something other than a number is typed in
                // If so, we'll just ignore it.
                try
                {
                    // Get the productId from the GridView's datakeys
                    int productId = Convert.ToInt32(gvShoppingCart.DataKeys[row.RowIndex].Value);
                    Label2.Text = productId.ToString();
                    // Find the quantity TextBox and retrieve the value
                    int quantity = int.Parse(((TextBox)row.Cells[1].FindControl("txtQuantity")).Text);

                    Label3.Text = quantity.ToString();
                    ShoppingCart.Cart.Instance.SetItemQuantity(productId, quantity);
                    BindData();
                }
                catch (FormatException) { }
            }
        }

        mpe2.Show();
    }
4

1 に答える 1

4

ポストバックでも GridView をデータバインドしていると思います。次の場合にのみ行う必要があります!Page.IsPostBack

if(!IsPostBack) BindGrid();

それとは別に、 a を使用する場合は、 を使用してコントロールへの参照を取得するTemplateField必要があります。FindControl

var txtQuantity = (TextBox)row.FindControl("txtQuantity");
int quantity = int.Parse(txtQuantity.Text);

DataControlRowType.DataRow補足: GridView の行を反復するときにチェックする必要はありません(RowCreatedまたはとは異なりますRowDataBound)。

于 2012-05-06T20:32:34.867 に答える