【问题标题】:Storing and Retrieving only specific rows from gridview into a session and calling it onto another gridview on another page仅将特定行从 gridview 存储和检索到会话中,并将其调用到另一个页面上的另一个 gridview
【发布时间】:2016-09-15 16:31:22
【问题描述】:

我是 asp.net 的新手。我正在尝试编写购物车。到目前为止,我能够在网格视图中显示我的项目,但是我是通过一个 no datasource 的列表来实现的。

假设我的商店页面显示我的 Gridview,其中包含 ID、名称、价格等列,然后是数量的模板字段。

然后,我只想获取文本框数量填充了某个数字的行,并仅将这些行显示到我的 ShoppingCart 页面上的另一个 gridview 上。

因此,在数量文本框中没有任何输入的其他项目不应出现在购物车页面上。这是我的代码:

Shop.aspx

  <asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False" >
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="ID" />
            <asp:BoundField DataField="Name" HeaderText="Name" />
            <asp:BoundField DataField="Price" DataFormatString="{0:c2}" HeaderText="Price" />
            <asp:TemplateField HeaderText="Quantity">
                <ItemTemplate>
                    <asp:TextBox ID="txtQuant" runat="server">
                    </asp:TextBox>
                    <asp:CompareValidator runat="server" Operator="DataTypeCheck" Type="Integer"
                        ControlToValidate="txtQuant" ErrorMessage="Value must be a whole number" ForeColor="Red"/>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>
<br />
<asp:ValidationSummary ID="ValidationSummary1" runat="server" />
<asp:Button ID="btnAdd" runat="server" Text="Add To Cart" OnClick="btnAdd_Click" />

Shop.aspx.cs

    // go through each product row
    foreach (GridViewRow Products in gvProducts.Rows)
    {
        string tb = (gvProducts.FindControl("txtQuant") as TextBox).Text; //get tb value
        if (tb == null) // if textbox is null
        {
        }
        else
        {                       
            List<string> selecteditems = new List<string>();//create a list called addeditems
                        selecteditems.Add(tb);
 string[] addeditems = selecteditems.ToArray();//convert list to array

Session["ShoppingCart"] = addeditems; // save arraylist as session called ShoppingCart
        }
    }
    Response.Redirect("~/ShoppingCart.aspx");

ShoppingCart.aspx

 <asp:GridView ID="gvProductsList" runat="server" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="ID" HeaderText="ID" />
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="Price" DataFormatString="{0:c2}" HeaderText="Price" />
        <asp:BoundField DataField="Quantity" HeaderText="Quantity" />
        <asp:TemplateField HeaderText="Product Total">
            <ItemTemplate>
                <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

<asp:Label ID="lblTotal" runat="server" Text="Order Total: "></asp:Label>

<p>&nbsp;</p>
<asp:Button ID="btnBack" runat="server" Text="Keep Shopping" OnClick="btnBack_Click" />

<asp:Button ID="btnDone" runat="server" Text="Done" OnClick="btnDone_Click" />

ShoppingCart.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["ShoppingCart"] == null)
    {
        Response.Write("Your Shopping Cart is empty");
    }
    else
    {
       string[] addeditems = (string[])Session["ShoppingCart"];//call the session back
        gvProductsList.DataSource = addeditems;
        gvProductsList.DataBind();
    }
}

【问题讨论】:

  • 您能否展示您的绑定代码gvProducts,您是如何绑定的?另一件要清除的事情是,您仅在 Session["ShoppingCart"] 中保存了数量字段,因此它从 ShoppingCart.aspx 页面中获取 ID、名称、价格为 gvProductsList 以绑定 GridView。
  • 绑定gvProducts背后的代码(get Details是我的Products类中列表的名称):protected void Page_Load(object sender, EventArgs e)//绑定列表到gridview { gvProducts.DataSource = Products.getDetails(); gvProducts.DataBind(); }
  • 我对如何绑定ID、名称和价格有点困惑。我有 2 个课程,产品和购物车。在 Products 类中,我有获取和设置 int ID、string Name 和 double Price 的方法,然后是产品列表。在 Shopping Cart 类中,我有 public Products Item { get;放; } 公共 int 数量 { 获取;放; }

标签: c# asp.net gridview


【解决方案1】:

您不会将 GridView 中的行“带入”“会话”。您分析您需要哪些数据行并从支持数据存储中获取适当的引用。使用这些引用,您可以构建一个具有适当商品 ID 和数量的购物车条目。

但是您也正在将控制权转移到另一个页面。您必须确保为购物车选择的商品在那里可用。您不能使用在 Page1 中创建的变量将数据传递给 Page2。您需要将数据存储在可以从 Page2 中检索到的位置。这称为持久化数据

理想情况下,您应该在基于您的 ShoppingCart 类和用户 ID 的数据库中创建一个购物车表。

但这可以使用应用程序缓存来完成。在那里创建您的产品列表和购物车列表,但只创建一次:

public partial class Page1 : System.Web.UI.Page {
  List<Products>     Products     = null ;
  List<ShoppingCart> ShoppingCart = null ;

  protected void Page_Load( object sender, EventArgs e ) {
    if ( !Page.IsPostBack ) {
      Cache[ "Products" ] = new List<Products>;
      Cache[ "ShoppingCart" ] = new List<ShoppingCart>;

      Products     = ( List<Products> )     Cache["Products"];
      ShoppingCart = ( List<ShoppingCart> ) Cache["ShoppingCart"];

    }
  }
}

然后,当您转移到 Page2 时,产品和 ShoppingCart 将通过应用程序缓存可用:

public partial class Page2 : System.Web.UI.Page {

  List<Products>     Products     = null ;
  List<ShoppingCart> ShoppingCart = null ;

  protected void Page_Load( object sender, EventArgs e ) {
    // be sure to check for null
    Products     = ( List<Products> )     Cache["Products"];
    ShoppingCart = ( List<ShoppingCart> ) Cache["ShoppingCart"];
  }
}

这还允许您从购物车中删除商品,并在您转回第 1 页时获得更新的“购物车”数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多