none
[ASP.NET] 在 GridView 中保留各分頁輸入過的值或狀態? RRS feed

  • 問題

  • 環境 :xp sp3 + vs2005 + asp.net 2.0

    請教前輩們,在 GridView 中,我以十筆資料為分頁依據,我有開放一個欄位為 textbox 準備給使用者輸入的

    當使用者在某一頁的幾筆資料列該欄位都打上一些訊息,當使用者切換別頁時,我有辦法將這頁的值留下來嗎?

    使用者再次切回該頁時「值」依然存在。

    2011年2月16日 上午 07:13

解答

  • hidden/cookie/viewstate/session

    再get/set


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年2月16日 上午 07:29
    版主
  • 91 is speaking a great point, Web server won't remember all the data that a web form is having. IIS will consider each postback as a new web client. This is a topic of state management for web. You could use cookie/queryString/hidden in client side, session/viewstate/application in server side.

    Below is a sample on storing a checkbox value in gridview by using session.

    http://aspdotnet-suresh.blogspot.com/2010/04/maintaining-state-of-checkboxes-while.html


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    2011年2月16日 上午 08:34
  • 我也附議版主的說法,你可以先評估一下看是否真要這樣做,如果是的話,可以參考下列程式碼,看能否滿足你的需求。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.Objects;
    
    namespace jQueryLab
    {
      public partial class WebForm8 : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          if (!IsPostBack)
          {
            GVBind();
          }      
        }
    
        private void GVBind()
        {
          using (testEntities context = new testEntities())
          {
            ObjectQuery<Members> m = context.Members;
            var query = from p in m
                  select p;
            GridView1.DataSource = query;
            GridView1.DataBind();
          }
        }
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
          Dictionary<string, string> Memo = new Dictionary<string, string>();
          //換頁前先儲存USER輸入的資料
          for (int i = 0; i < GridView1.PageSize; i++)
          {
            TextBox TextBox1 = GridView1.Rows[i].FindControl("TextBox1") as TextBox;
            if (Session["Memo"] != null)
              Memo = Session["Memo"] as Dictionary<string, string>;
    
            if (Memo.ContainsKey(GridView1.DataKeys[i].Value.ToString()))
              Memo[GridView1.DataKeys[i].Value.ToString()] = TextBox1.Text;
            else
              Memo.Add(GridView1.DataKeys[i].Value.ToString(), TextBox1.Text);
          }
          Session["Memo"] = Memo;
          GridView1.PageIndex = e.NewPageIndex;
          GVBind();
    
          //換頁後將USER輸入的資料還原
          if (Session["Memo"] != null)
          {
            for (int i = 0; i < GridView1.PageSize; i++)
            {
              if (Memo.ContainsKey(GridView1.DataKeys[i].Value.ToString()))
              {
                ((TextBox)GridView1.Rows[i].FindControl("TextBox1")).Text = Memo[GridView1.DataKeys[i].Value.ToString()];
              }
            }
          }
        }    
      }
    }
    


    http://www.dotblogs.com.tw/terrychuang/
    2011年2月16日 上午 09:33

所有回覆

  • hidden/cookie/viewstate/session

    再get/set


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年2月16日 上午 07:29
    版主
  • 可能又表達不清楚了,所謂的「分頁」我是指 GridView 的分頁,例如我有 100 筆資料,

    當我在第一頁各列輸入一些的值,切換 gridview 的第二頁或是其他頁,再切回第一頁,Gridview 上第一頁各原本 row 有值得欄位

    依然安,不是切換網頁。

    2011年2月16日 上午 07:45
  • 您沒有表達不清楚,我也是在回答您的問題。

    換頁,會postback,對browser來講,就是兩個document。

    就得用暫存記值。

    基本上,我會從需求面就檔掉,因為你會記不完。

    一萬頁怎麼辦?怎麼記?這是web, 不是winform。

    要記,就要付出代價。


    常用資源參考:
    小弟的blog: In 91,wiki: my wiki
    2011年2月16日 上午 07:49
    版主
  • 91 is speaking a great point, Web server won't remember all the data that a web form is having. IIS will consider each postback as a new web client. This is a topic of state management for web. You could use cookie/queryString/hidden in client side, session/viewstate/application in server side.

    Below is a sample on storing a checkbox value in gridview by using session.

    http://aspdotnet-suresh.blogspot.com/2010/04/maintaining-state-of-checkboxes-while.html


    大家一齊探討、學習和研究,謝謝!
    Microsoft MVP, Microsoft Community Star(TW & HK), MCT,
    MCSD, MCAD, MCSE+I, MCDBA, MCDST, MCSA, MCTS, MCITP, MCPD
    2011年2月16日 上午 08:34
  • 我也附議版主的說法,你可以先評估一下看是否真要這樣做,如果是的話,可以參考下列程式碼,看能否滿足你的需求。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data.Objects;
    
    namespace jQueryLab
    {
      public partial class WebForm8 : System.Web.UI.Page
      {
        protected void Page_Load(object sender, EventArgs e)
        {
          if (!IsPostBack)
          {
            GVBind();
          }      
        }
    
        private void GVBind()
        {
          using (testEntities context = new testEntities())
          {
            ObjectQuery<Members> m = context.Members;
            var query = from p in m
                  select p;
            GridView1.DataSource = query;
            GridView1.DataBind();
          }
        }
        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
          Dictionary<string, string> Memo = new Dictionary<string, string>();
          //換頁前先儲存USER輸入的資料
          for (int i = 0; i < GridView1.PageSize; i++)
          {
            TextBox TextBox1 = GridView1.Rows[i].FindControl("TextBox1") as TextBox;
            if (Session["Memo"] != null)
              Memo = Session["Memo"] as Dictionary<string, string>;
    
            if (Memo.ContainsKey(GridView1.DataKeys[i].Value.ToString()))
              Memo[GridView1.DataKeys[i].Value.ToString()] = TextBox1.Text;
            else
              Memo.Add(GridView1.DataKeys[i].Value.ToString(), TextBox1.Text);
          }
          Session["Memo"] = Memo;
          GridView1.PageIndex = e.NewPageIndex;
          GVBind();
    
          //換頁後將USER輸入的資料還原
          if (Session["Memo"] != null)
          {
            for (int i = 0; i < GridView1.PageSize; i++)
            {
              if (Memo.ContainsKey(GridView1.DataKeys[i].Value.ToString()))
              {
                ((TextBox)GridView1.Rows[i].FindControl("TextBox1")).Text = Memo[GridView1.DataKeys[i].Value.ToString()];
              }
            }
          }
        }    
      }
    }
    


    http://www.dotblogs.com.tw/terrychuang/
    2011年2月16日 上午 09:33
  • 即使在windows form, 也不太會存好幾頁前的輸入資料,

    像這種編輯好幾頁的資料(像是工作週報), 你可以在換頁時檢查是否有異動資料,

    有異動的話就彈跳視窗請user儲存該頁的資料,

    這部份可利用javascript去check, 應該有很多辦法,

    但你的user堅持要存好幾頁前的輸入資料, 我建議是只存異動過的資料

    2011年2月17日 上午 03:38
  • 感謝各位前輩的提點。
    2011年2月17日 上午 08:45