グリッドビューラッパー(asp.net)

    /// <summary>
    /// グリッドビューラッパー。
    /// </summary>
    public class GridViewWrapper
    {
        #region 定数定義
        /// <summary>
        /// 一覧情報を格納するViewStateのキー名
        /// </summary>
        private const string GRIDVIEW_DATA = "GRIDVIEW_DATA";

        /// <summary>
        /// 直近のソートを実施したカラム名を格納するViewStateのキー名
        /// </summary>
        private const string GRID_SORT_COLUMN = "GRID_SORT_COLUMN";

        /// <summary>
        /// 直近のソートを実施したソート方向を格納するViewStateのキー名
        /// </summary>
        private const string GRID_SORT_DIRECTION = "GRID_SORT_DIRECTION";
        #endregion

        #region 変数定義
        /// <summary>
        /// 検索結果一覧グリッドビュー
        /// </summary>
        protected GridView gv;

        /// <summary>
        /// ViewState
        /// </summary>
        private StateBag viewState;

        private string checkedStatusColumn;
        #endregion

        #region イベント定義
        /// <summary>
        /// グリッドが描画する前のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gv_PreRender(object sender, EventArgs e)
        {
            if (((GridView)sender).Controls.Count > 0
                && ((GridView)sender).Controls[0].Controls.Count > 0)
                // Pager行が常に表示する
                ((GridView)sender).Controls[0].Controls[0].Visible = true;
        }

        /// <summary>
        /// グリッドのヘッダ部のリンクをクリックした際のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gv_Sorting(object sender, GridViewSortEventArgs e)
        {
            // ViewStateから検索結果を取得する
            IList<IBaseDTO> result = (IList<IBaseDTO>)GetViewState(GRIDVIEW_DATA);

            // 検索結果が取得できた場合
            if (result != null)
            {
                if (e.SortExpression.Equals((string)GetViewState(GRID_SORT_COLUMN)))
                {
                    // 前回のソート列が今回のソート列と一致する場合

                    // 前回のソート方向が昇順の場合
                    if (ListUtil.SortDirection.Asc.Equals((ListUtil.SortDirection)GetViewState(GRID_SORT_DIRECTION)))
                        // 今回のソート方向・降順をViewStateに格納する
                        SetViewState(GRID_SORT_DIRECTION, ListUtil.SortDirection.Desc);
                    else
                        // 今回のソート方向・昇順をViewStateに格納する
                        SetViewState(GRID_SORT_DIRECTION, ListUtil.SortDirection.Asc);
                }
                else
                {
                    // 前回のソート列と、今回のソート列が異なる場合

                    // 今回のソート方向・昇順をViewStateに格納する
                    SetViewState(GRID_SORT_DIRECTION, ListUtil.SortDirection.Asc);
                }

                // 今回のソート列をViewStateに格納する
                SetViewState(GRID_SORT_COLUMN, e.SortExpression);

                // 検索結果に対してソートを実施する
                ListUtil.Sort(result, e.SortExpression, (ListUtil.SortDirection)GetViewState(GRID_SORT_DIRECTION));

                // ソート結果をSessionに格納
                SetViewState(GRIDVIEW_DATA, result);

                // 検索結果をグリッドにバインドする
                DataBind();
            }
        }

        /// <summary>
        /// 検索結果用グリッド内のデータバウンド時のイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gv_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (DataControlRowType.DataRow.Equals(e.Row.RowType))
            {
                // DataRowの場合
            }
            else if (DataControlRowType.Footer.Equals(e.Row.RowType))
            {
                // Footerの場合

                // 合計金額を合算し、設定する
                IList<IBaseDTO> list = (IList<IBaseDTO>)GetViewState(GRIDVIEW_DATA);
                for (int i = 0; i < e.Row.Cells.Count; i++)
                {
                    if (((GridView)sender).Columns[i] is ClmsBoundField)
                    {
                        if (((ClmsBoundField)((GridView)sender).Columns[i]).IsTotalColumn)
                        {
                            e.Row.Cells[i].Text = StringUtil.FormatNumberAddComma(ListUtil.Total(list, ((ClmsBoundField)((GridView)sender).Columns[i]).DataField));
                        }
                    }
                }
            }
            else if (DataControlRowType.Pager.Equals(e.Row.RowType))
            {
                // Pagerの場合

                // 検索結果の件数を計算する
                int resultCnt = ((IList<IBaseDTO>)GetViewState(GRIDVIEW_DATA)).Count;

                // 今表示されてるページ数を設定する
                ((Label)e.Row.FindControl("lblCurrentPage")).Text = (((GridView)sender).PageIndex + 1).ToString();
                // ページ総数を設定する
                ((Label)e.Row.FindControl("lblPages")).Text = ((GridView)sender).PageCount.ToString();
                // 検索結果の件数を設定する
                ((Label)e.Row.FindControl("lblCnt")).Text = resultCnt.ToString();

                // ページリンクボタンの制御
                ((LinkButton)e.Row.FindControl("lkbFirstPage")).Enabled = false;
                ((LinkButton)e.Row.FindControl("lkbPrevPage")).Enabled = false;
                ((LinkButton)e.Row.FindControl("lkbNextPage")).Enabled = false;
                ((LinkButton)e.Row.FindControl("lkbLastPage")).Enabled = false;
                if (((GridView)sender).PageIndex == 0 && ((GridView)sender).PageCount > 1)
                {
                    // Firstページの場合
                    ((LinkButton)e.Row.FindControl("lkbNextPage")).Enabled = true;
                    ((LinkButton)e.Row.FindControl("lkbLastPage")).Enabled = true;
                }
                else if (((GridView)sender).PageIndex == ((GridView)sender).PageCount - 1
                    && ((GridView)sender).PageCount > 1)
                {
                    // Lastページの場合
                    ((LinkButton)e.Row.FindControl("lkbFirstPage")).Enabled = true;
                    ((LinkButton)e.Row.FindControl("lkbPrevPage")).Enabled = true;
                }
                else if (((GridView)sender).PageCount > 1)
                {
                    // 上記以外の場合
                    ((LinkButton)e.Row.FindControl("lkbNextPage")).Enabled = true;
                    ((LinkButton)e.Row.FindControl("lkbLastPage")).Enabled = true;
                    ((LinkButton)e.Row.FindControl("lkbFirstPage")).Enabled = true;
                    ((LinkButton)e.Row.FindControl("lkbPrevPage")).Enabled = true;
                }
            }
        }

        /// <summary>
        /// RowCommandのイベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void gv_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            // チェックボックスの状態を保存する
            SaveCheckBoxStatus();

            if (e.CommandName == "NextPage")
            {
                ((GridView)sender).PageIndex++;

                // 検索結果をグリッドにバインドする
                DataBind();
            }
            else if (e.CommandName == "LastPage")
            {
                ((GridView)sender).PageIndex = ((GridView)sender).PageCount - 1;

                // 検索結果をグリッドにバインドする
                DataBind();
            }
            else if (e.CommandName == "FirstPage")
            {
                ((GridView)sender).PageIndex = 0;

                // 検索結果をグリッドにバインドする
                DataBind();
            }
            else if (e.CommandName == "PrevPage")
            {
                ((GridView)sender).PageIndex--;

                // 検索結果をグリッドにバインドする
                DataBind();
            }
        }
        #endregion

        #region 内部関数
        /// <summary>
        /// キーよりViewStateから値を取得する
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        private object GetViewState(string key)
        {
            return this.viewState[this.gv.ID + "_" + key];
        }

        /// <summary>
        /// ViewStateに値を設定する
        /// </summary>
        /// <param name="key"></param>
        /// <param name="obj"></param>
        private void SetViewState(string key, object obj)
        {
            this.viewState[this.gv.ID + "_" + key] = obj;
        }
        #endregion

        #region プロパティ
        /// <summary>
        /// 一覧表示データを取得・設定する
        /// </summary>
        public IList<IBaseDTO> DataSource
        {
            get { return (IList<IBaseDTO>)GetViewState(GRIDVIEW_DATA); }
            set { SetViewState(GRIDVIEW_DATA, value); }
        }

        /// <summary>
        /// PageIndex
        /// </summary>
        public int PageIndex
        {
            get { return this.gv.PageIndex; }
            set { this.gv.PageIndex = value; }
        }

        /// <summary>
        /// DataKeyNames
        /// </summary>
        public string[] DataKeyNames
        {
            get { return this.gv.DataKeyNames; }
        }
        #endregion

        #region 外部関数
        /// <summary>
        /// 一覧データをグリッドにバインドする。
        /// </summary>
        public void DataBind()
        {
            // 検索結果をグリッドにバインドする
            this.gv.DataSource = (IList<IBaseDTO>)GetViewState(GRIDVIEW_DATA);
            this.gv.DataBind();
        }

        /// <summary>
        /// グリッドビューのチェックボックスの状態を保存する
        /// </summary>
        public void SaveCheckBoxStatus()
        {
            if (string.IsNullOrEmpty(this.checkedStatusColumn))
                return;

            string chkCtrlNm = "chk" + this.checkedStatusColumn;
            IList<IBaseDTO> list = (IList<IBaseDTO>)GetViewState(GRIDVIEW_DATA);
            int startIdx = this.gv.PageIndex * this.gv.PageSize;
            foreach (GridViewRow row in this.gv.Rows)
            {
                list[startIdx + row.RowIndex].GetType().GetProperty(
                    this.checkedStatusColumn).SetValue(list[startIdx + row.RowIndex],
                    ((CheckBox)row.FindControl(chkCtrlNm)).Checked,
                    null);
            }
        }
        #endregion

        #region コンストラクタ
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="gv">GridView</param>
        /// <param name="viewState">ViewState</param>
        public GridViewWrapper(GridView gv, StateBag viewState)
        {
            this.gv = gv;
            this.viewState = viewState;

            this.gv.Sorting += new GridViewSortEventHandler(gv_Sorting);
            this.gv.RowDataBound += new GridViewRowEventHandler(gv_RowDataBound);
            this.gv.RowCommand += new GridViewCommandEventHandler(gv_RowCommand);
            this.gv.PreRender += new EventHandler(gv_PreRender);
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="gv">GridView</param>
        /// <param name="viewState">ViewState</param>
        /// <param name="checkedStatusColumn">チェックボックス名</param>
        public GridViewWrapper(GridView gv, StateBag viewState, string checkedStatusColumn)
        {
            this.gv = gv;
            this.viewState = viewState;
            this.checkedStatusColumn = checkedStatusColumn;

            this.gv.Sorting += new GridViewSortEventHandler(gv_Sorting);
            this.gv.RowDataBound += new GridViewRowEventHandler(gv_RowDataBound);
            this.gv.RowCommand += new GridViewCommandEventHandler(gv_RowCommand);
            this.gv.PreRender += new EventHandler(gv_PreRender);
        }
        #endregion
    }

转载于:https://my.oschina.net/cjkall/blog/195906

猜你喜欢

转载自blog.csdn.net/weixin_33675507/article/details/91756259