1

データベースから PageStart にデータを入力する 2 つの GridView があります。(ポストバックで) ページを更新すると、データテーブルのコンテンツが表示されませんでした。そのため、ページロードごとに GridView を再度データバインドすることを考えました。データをバインドするには、データを一時的にどこかに保存する必要があります。データを一時的に保存する最良の方法はどれですか?

私の最初のグリッドには約 10 行あり、2 番目の GridView には約 200 行あります。私はページングを使用していません

4

5 に答える 5

1

Cache オブジェクトと Session の使用法は、データをセッションごとに一時的に保存するか、同じデータを保存するすべてのセッションで保存するかによって異なります。アプリケーションの特定のセッションに対してのみ同じデータを保持する場合は、Session を使用できます。キャッシュは、アプリケーション全体のすべてのユーザー セッションに使用できます。

于 2013-02-27T08:53:11.163 に答える
1

を使用した完全に機能するサンプルを次に示しますが、他のキャッシュ方法ViewStateに変更できます。

ここに画像の説明を入力

デフォルト.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:GridView runat="server" ID="gvProd" AutoGenerateColumns="false" OnRowDataBound="gvProd_RowDataBound" OnRowCommand="gvProd_RowCommand">
            <Columns>
                <asp:TemplateField HeaderText="Product">
                    <ItemTemplate>
                        <asp:Literal runat="server" ID="litNm"></asp:Literal>
                        <asp:DropDownList runat="server" ID="ddlQty"></asp:DropDownList>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Add To Cart">
                    <ItemTemplate>
                        <asp:LinkButton runat="server" ID="lbnAdd" Text="Add To Cart" CommandName="AddToCart"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
        <hr />
        <asp:GridView runat="server" ID="gvCart" AutoGenerateColumns="false" OnRowDataBound="gvCart_RowDataBound" OnRowCommand="gvCart_RowCommand">
            <Columns>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:Literal runat="server" ID="litNm"></asp:Literal>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:TextBox runat="server" ID="txtQty"></asp:TextBox>
                        <asp:Button runat="server" ID="btnUpdate" Text="Update Qty" CommandName="UpdateCart" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>

Default.aspx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class Default : System.Web.UI.Page
    {
        [Serializable]
        public class Product
        {
            public int PID { get; set; }
            public string Name { get; set; }

            public Product(int i) { this.PID = i; this.Name = "product " + i.ToString(); }
        }

        [Serializable]
        public class CartItem
        {
            public Product Prod { get; set; }
            public int Qty { get; set; }

            public CartItem(Product p, int q) { this.Prod = p; this.Qty = q; }
        }

        public List<CartItem> myCart = new List<CartItem>();
        public List<CartItem> MyCart
        {
            get
            {
                if (ViewState["cart"] == null)
                {
                    ViewState["cart"] = new List<CartItem>();
                }

                return ViewState["cart"] as List<CartItem>;
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
                BindProdGrid();
        }

        protected void BindProdGrid()
        {
            gvProd.DataSource = GetProducts();
            gvProd.DataBind();
        }

        protected List<Product> GetProducts()
        {
            var ret = new List<Product>();

            ret.Add(new Product(1));
            ret.Add(new Product(2));

            return ret;
        }

        protected void gvProd_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "AddToCart")
            {
                var row = (e.CommandSource as LinkButton).NamingContainer as GridViewRow;
                var ddl = row.FindControl("ddlQty") as DropDownList;

                var qty = Convert.ToInt32(ddl.SelectedValue);
                var pid = Convert.ToInt32(e.CommandArgument);

                AddToCart(pid, qty, increase: true);
                BindCartGrid(this.MyCart);
            }
        }

        protected void AddToCart(int pid, int qty, bool increase = false)
        {
            var cartItem = this.MyCart.Find(o => o.Prod.PID == pid);
            if (cartItem == null)
                this.MyCart.Add(new CartItem(new Product(pid), qty));
            else
                if (increase)
                    cartItem.Qty += qty;
                else
                    cartItem.Qty = qty;
        }

        protected void gvProd_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var item = e.Row.DataItem as Product;

                var litNm = e.Row.FindControl("litNm") as Literal;
                litNm.Text = item.Name;

                var ddlQty = e.Row.FindControl("ddlQty") as DropDownList;
                ddlQty.Items.Add(new ListItem("1", "1"));
                ddlQty.Items.Add(new ListItem("10", "10"));

                var lbnAdd = e.Row.FindControl("lbnAdd") as LinkButton;
                lbnAdd.CommandArgument = item.PID.ToString();
            }
        }

        protected void BindCartGrid(List<CartItem> items)
        {
            gvCart.DataSource = items;
            gvCart.DataBind();
        }

        protected void gvCart_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                var item = e.Row.DataItem as CartItem;

                var litNm = e.Row.FindControl("litNm") as Literal;
                litNm.Text = item.Prod.Name + " (pid:" + item.Prod.PID.ToString() + ")";

                var txtQty = e.Row.FindControl("txtQty") as TextBox;
                txtQty.Text = item.Qty.ToString();
                txtQty.Attributes["data-pid"] = item.Prod.PID.ToString();
            }
        }

        protected void gvCart_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "UpdateCart")
            {
                var row = (e.CommandSource as Button).NamingContainer as GridViewRow;
                var txtQty = row.FindControl("txtQty") as TextBox;

                var qty = Convert.ToInt32(txtQty.Text);
                var pid = Convert.ToInt32(txtQty.Attributes["data-pid"]);

                AddToCart(pid, qty, increase: false);
                BindCartGrid(this.MyCart);
            }
        }
    }
}
于 2013-03-01T07:32:17.663 に答える
0

ポストバック間のデータの永続性に対処するには、いくつかのオプションがあります。データ量が非常に少ないという非常に特殊なケースを除いて、私は ViewState に本当に反対しています (Microsoft が WebForms で失敗するのは、そのような場合です。デフォルトの動作は DemoWare です)。

データをCacheオブジェクトに保持し、ポストバック時にそのオブジェクトから読み取ることをお勧めします。しかし、それは実際には特定のユースケースに依存します。さまざまなテクニックがあります。

于 2013-02-27T05:43:31.000 に答える
0

データを保存するのに最適な場所はセッションです。Viewstate はクライアント側にすべてのデータをもたらしますが、これは望ましくないネットワーク/帯域幅のオーバーヘッドです。

PageStart は次のようになります。

public void PageStart()
{
if(Session["dt"] == null || !(Session["dt"] is datatable)){


datatable dt;
///your dt populating code
Session["dt"] = dt;
}
yourGridView.datasource = (datatable)Session["dt"];
yourGridView.databind();

} 
于 2013-02-27T06:57:04.473 に答える
0

必要な作業はこれだけです。
このようなデータでグリッドビューを埋めるメソッドまたは関数を配置します。

private void FillGrid()
{
    DataTable dt = new DataTable();
    dt = //Fill you datatable
    Gridview1.DataSource = dt;
    Gridview1.DataBind();
}

これは、ページロード イベントでやらなければならないことです。

protected void Page_Load(object sender, EventArgs e)  
{  
    if (!IsPostBack)  
    {  
        this.FillGrid();  
    }  
} 
于 2013-02-27T07:31:50.730 に答える