0

私は2つのグリッドビューを持つ私のプロジェクトにこのモジュールを持っています。1 つは Main MenuModule 用で、もう 1 つはサブメニュー用です。メイン メニュー モジュールの行がチェックされ、対応するサブメニューがある場合に、サブメニュー グリッドビューに表示されるように、リストを作成しました。

今、そのページに戻ると SubMenuGridview が表示されますが (セッションを使用しました)、チェックしたチェックボックスがすべてなくなっていることに気付きました。

私の問題は、メインメニューモジュールグリッドビューとサブメニューグリッドビューの両方から、チェックしたチェックボックスをページにどのように記憶させるかということでした。

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();
            }
        }
    }
}
4

1 に答える 1

0

これは、次を使用して実行できます。

  1. ビューステート
  2. SessionPageStatePersister
  3. カスタム セッション ベースのソリューション

ビュー ステートについては、以下の投稿されたリンクをコメントで参照してください。

カスタム セッション ベースのソリューション

pre render メソッドを使用します。このメソッドは、ページが初期化された後、その 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;

}

SessionPageStatePersister

抽象 PageStatePersister クラスは、ページ状態のストレージと処理をカプセル化する基本クラスを表します。ストレージは、デフォルトの HiddenFieldPageStatePersister クラスまたは SessionPageStatePersister で実行できます。SessionPageStatePersister を使用すると、.NET サーバーは、フォームの非表示フィールドではなく、セッション オブジェクトで _VIEWSTATE を管理します。状態ストレージを変更すると、次のようになります。

protected override PageStatePersister PageStatePersister
{
    get
    {
        return new SessionPageStatePersister(this);
    }
}
于 2013-09-26T09:26:59.573 に答える