页面无限跳转间如何保存页面状态 (3)

来源:互联网 发布:三维家具设计软件 编辑:程序博客网 时间:2024/06/08 11:26
在页面上的使用,定义好了以上这些之后,在页面中该怎样用呢?
首先,在List页面中实现IPageInfo接口:
     public class RoleList : System.Web.UI.Page,IPageInfo
然后针对每一个DataGrid实例化一个DataInfo对象:
protected DataInfo dataInfo = new DataInfo("Role");
接着写一些处理DataGrid状态的代码,我是使用的属性:
#region 数据网格状态信息
         private System.Collections.Hashtable SearchParams
         {
              get
              {
                   if (ViewState["SearchParams"] != null)
                   {
                       return (Hashtable)ViewState["SearchParams"];
                   }
                   else
                       return null;
              }
              set
              {
                   ViewState["SearchParams"] = value;
              }
         }
 
         private System.Collections.Hashtable OtherDataParams
         {
              get
              {
                   if (ViewState["OtherDataParams"] != null)
                   {
                       return (Hashtable)ViewState["OtherDataParams"];
                   }
                   else
                       return null;
              }
              set
              {
                   ViewState["OtherDataParams"] = value;
              }
         }
 
         private int CurrentPage
         {
              get
              {
                   return MyDataGrid.CurrentPageIndex;
              }
              set
              {
                   MyDataGrid.CurrentPageIndex = value;
                   MyDataGrid.DataBind();
                   navigateRole.CurrentPage = MyDataGrid.CurrentPageIndex + 1;
                   navigateRole.TotalPages = MyDataGrid.PageCount;
              }
         }
 
         private string SortExpression
         {
              get
              {
                   return dsSystem.Role.DefaultView.Sort;
              }
              set
              {
                   dsSystem.Role.DefaultView.Sort = value;
                   MyDataGrid.DataBind();
                   navigateRole.TotalPages = MyDataGrid.PageCount;
              }
         }
 
         private string ItemID
         {
              get
              {
                   if (MyDataGrid.SelectedIndex >= 0)
                   {
                       return MyDataGrid.DataKeys[MyDataGrid.SelectedIndex].ToString();
                   }
                   else
                       return null;
              }
              set
              {
                   int pageIndex = MyDataGrid.CurrentPageIndex;
                   bool find = false;
                   for( int j = 0; j < MyDataGrid.PageCount && find == false; j++)
                   {
                       MyDataGrid.CurrentPageIndex = j;
                       MyDataGrid.DataBind();
                        for(int i = 0; i < MyDataGrid.Items.Count; i++)
                       {
                            if (MyDataGrid.DataKeys[i].ToString() == value)
                            {
                                 find = true;
                                 break;
                            }
                       }
                   }
                   if (find == false)
                   {
                       MyDataGrid.CurrentPageIndex = pageIndex;
                       MyDataGrid.DataBind();
                   }
                   navigateRole.CurrentPage = MyDataGrid.CurrentPageIndex + 1;
                   navigateRole.TotalPages = MyDataGrid.PageCount;
              }
         }
         #endregion
 
PageLoad中取出前一页面的数据,进行处理,注意,从前一页面过来用的是Server.Transfer方法:
IPageInfo pageInfo = null;
                   //取出前一页面的信息并保存数据网格状态的信息
                   try
                   {
                       pageInfo = (IPageInfo)Context.Handler;
                   }
                   catch {}
                   if (pageInfo != null)
                   {
                       if (pageInfo.OtherParams != null)
                            OtherParams = pageInfo.OtherParams;
                       if (pageInfo.DataInfos != null)
                       {
                            //保存全部DataGrid信息
                            DataInfos = pageInfo.DataInfos;
                            //取出当前DataGrid的信息
                            if (pageInfo.DataInfos[dataInfo.DataName] != null)
                            {
                                 dataInfo = pageInfo.DataInfos[dataInfo.DataName];
                            }
                       }
              }
把数据取出来了然后自然就是处理了,我是设置前面那些属性的值的,实际上方法有很多种,这里就不详述了。
IPageInfo的实现,其中处理DataInfos属性时要更新页面上每一个DataGrid对应的DataInfo的信息,以反映最近的更改:
public string PageName
         {
              get
              {
                   return "RoleList";
              }
         }
 
         public Hashtable OtherParams
         {
              get
              {
                   if (ViewState["OtherParams"] != null)
                   {
                       return (Hashtable)ViewState["OtherParams"];
                   }
                   else
                       return null;
              }
              set
              {
                   ViewState["OtherParams"] = value;
              }
         }
 
         public DataInfoList DataInfos
         {
              get
              {
                   //更新数据网格状态信息
                   DataInfoList dataInfoList;
                   if (ViewState["DataInfos"] != null)
                       dataInfoList = (DataInfoList)ViewState["DataInfos"];
                   else
                       dataInfoList = new DataInfoList();
                   dataInfo.CurrentPage = CurrentPage;
                   dataInfo.ItemID = ItemID;
                   dataInfo.OtherParams = OtherDataParams;
                  dataInfo.SearchParams = SearchParams;
                   dataInfo.SortExpression = SortExpression;
                   dataInfoList[dataInfo.DataName] = dataInfo;
                   return dataInfoList;
              }
              set
              {
                   ViewState["DataInfos"] = value;
              }
         }
 
跳转到其他页面(如详细页面):
Server.Transfer("RoleDetail.aspx");
 
对于Detail页面,会比较简单一些,因为基本上没有DatInfo更新的问题,旨在删除和新增时需要修改ItemID:
也是先实现接口:
public class RoleDetail : System.Web.UI.Page,IPageInfo
接着定义两个变量,一个保存前页来的数据,一个定义当前的数据类别,也就是要对哪一个DataInfo实例进行操作:
protected IPageInfo pageInfo;
protected string dataName = "Role";
 
PageLoad取出前页数据并处理当前项数据:
try
         {
              pageInfo = (IPageInfo)Context.Handler;
         }
         catch
         {
         }
         //取出当前项的ID
         if (pageInfo != null && pageInfo.DataInfos != null)
         {
              DataInfos = pageInfo.DataInfos;
         }
         //取详细数据
         if (DataInfos != null && DataInfos[dataName].ItemID != null)
              GetItemData();
         else
          GetNullData();
 
接口的实现:
public string PageName
         {
              get
              {
                   return "RoleDetail";
              }
         }
 
         public DataInfoList DataInfos
         {
              get
              {
                   if (ViewState["DataInfos"] != null)
                   {
                       return (DataInfoList)ViewState["DataInfos"];
                   }
                   else
                       return null;
              }
              set
              {
                   ViewState["DataInfos"] = value;
              }
         }
 
         public Hashtable OtherParams
         {
              get
              {
                   if (ViewState["OtherParams"] != null)
                   {
                       return (Hashtable)ViewState["OtherParams"];
                   }
                   else
                       return null;
              }
              set
              {
                   ViewState["OtherParams"] = value;
              }
         }
 
         #endregion
 
跳转到其他页面(如返回List):
Server.Transfer("RoleList.aspx");
 
这样我们需要的功能便实现了。