C# “在GridView上维护我的选择”复选框

C# “在GridView上维护我的选择”复选框,c#,asp.net,session,gridview,checkbox,C#,Asp.net,Session,Gridview,Checkbox,我的项目中有这个模块,其中有两个GridView。一个用于主菜单模块,另一个用于其子菜单。我创建了一个列表,这样当我的主菜单模块上的一行被选中并且有相应的子菜单时,它将显示在子菜单Gridview上 现在,当我回到那个页面(我使用了会话)时,我可以看到我的子菜单GridView,但是我注意到我勾选的复选框都不见了 我的问题是我的页面如何记住我在主菜单模块gridview和子菜单gridview中选中的复选框 protected void cbxSelect_CheckedChanged(obje

我的项目中有这个模块,其中有两个GridView。一个用于主菜单模块,另一个用于其子菜单。我创建了一个列表,这样当我的主菜单模块上的一行被选中并且有相应的子菜单时,它将显示在子菜单Gridview上

现在,当我回到那个页面(我使用了会话)时,我可以看到我的子菜单GridView,但是我注意到我勾选的复选框都不见了

我的问题是我的页面如何记住我在主菜单模块gridview和子菜单gridview中选中的复选框

protected void cbxSelect_CheckedChanged(object sender, EventArgs e)
{
    SubMenuGrid.DataSource = null;
    SubMenuGrid.DataBind();

    Business.SubMenuModules sub = new Business.SubMenuModules();

    List<oSubList> oList = new List<oSubList>();

    int counter = 0;

    foreach (GridViewRow nRow in gvModuleList.Rows)
    {
        Int32 intModID = Convert.ToInt32(nRow.Cells[0].Text);
        CheckBox chkBx = (CheckBox)nRow.FindControl("cbxSelect");

        if (chkBx.Checked == true)
        {
            counter = counter + 1;

            var oModList = sub.GetAllMenuPerModuleID(intModID);

            if (oModList.Count > 0)
            {
                foreach (var rec in oModList)
                {
                    oSubList olist = new oSubList
                    {
                        ID = rec.ID,
                        ModuleID = rec.ModuleID,
                        Submenu = rec.Submenu,
                        Description = rec.Description
                    };
                    oList.Add(olist);    
                }

                Session["list"]=oList;

                SubMenuGrid.DataSource = oList;
                SubMenuGrid.DataBind();
            }
        }
    }
}
protectedvoid cbxSelect\u CheckedChanged(对象发送方,事件参数e)
{
subnumgrid.DataSource=null;
subnumgrid.DataBind();
Business.submonummodules sub=新建Business.submonummodules();
List oList=新列表();
int计数器=0;
foreach(gvModuleList.Rows中的GridViewRow nRow)
{
Int32 intModID=Convert.ToInt32(nRow.Cells[0].Text);
复选框chkBx=(复选框)nRow.FindControl(“cbxSelect”);
if(chkBx.Checked==true)
{
计数器=计数器+1;
var oModList=sub.GetAllMenuPerModuleID(intModID);
如果(oModList.Count>0)
{
foreach(oModList中的var rec)
{
oSubList olist=新的oSubList
{
ID=记录ID,
ModuleID=rec.ModuleID,
子菜单=记录子菜单,
描述=记录描述
};
添加(oList);
}
会话[“列表”]=列表;
submonugrid.DataSource=oList;
subnumgrid.DataBind();
}
}
}
}

这可以通过以下方式完成:

  • 视图状态
  • SessionPageStatePersister
  • 自定义基于会话的解决方案
  • 有关查看状态的信息,请参见下面在评论中发布的链接

    基于自定义会话的解决方案

    我们将使用预渲染方法。 此方法在页面初始化后但在保存其ViewState并呈现之前被调用。 将把Request.Form加载到会话变量中,并在每次调用非回发页面时将其加载回

    protected void Page_PreRender(object sender, EventArgs e)
    {
       if (!Page.IsPostBack && Session["PageState"] != null)
       {
        NameValueCollection formValues = (NameValueCollection)Session["PageState"];
    
        String[] keysArray = formValues.AllKeys;
        for (int i = 0; i < keysArray.Length; i++)
        {
          Control currentControl = Page.FindControl(keysArray[i]);
          if (currentControl != null)
          {
            if (currentControl.GetType() == typeof(System.Web.UI.WebControls.TextBox)) ((TextBox)currentControl).Text = formValues[keysArray[i]];
            else if (currentControl.GetType() == typeof(System.Web.UI.WebControls.CheckBox))
          {
          if (formValues[keysArray[i]].Equals("on")) ((CheckBox)currentControl).Checked = true;
            }
            else if (currentControl.GetType() == typeof(System.Web.UI.WebControls.DropDownList))
    ((DropDownList)currentControl).SelectedValue = formValues[keysArray[i]].Trim();
          }
        }
      }
    
      if(Page.IsPostBack) Session["PageState"] = Request.Form;
    
    }
    

    如何在模块中实现Viewstate?我从哪里开始?我可以在Viewstate上看到一些源代码,但我无法将其应用于我的场景。请执行类似操作。。
    protected override PageStatePersister PageStatePersister
    {
        get
        {
            return new SessionPageStatePersister(this);
        }
    }