/// <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