重新封装了一个 GridView,支持如下功能:
1. CheckBox选择记录,指定CheckBox的位置
2. 支持List排序
3. 排序时在Header部分出现图标
代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Reflection;
namespace xxWare.xxControls
{
[ToolboxData("<{0}:xxGridView runat=server></{0}:xxGridView>")]
public class xxGridView : System.Web.UI.WebControls.GridView
{
#region Properties
// sort image url : full url = Sort_Image_Url + Asc_Image_Name
[Browsable(true) , Category("Sort Image"), DefaultValue("images/arrow_up.gif") , Description("Asc Image")]
public string Asc_Image { get; set; }
[Browsable(true), Category("Sort Image"), DefaultValue("images/arrow_down.gif"), Description("Desc Image")]
public string Desc_Image { get; set; }
[Browsable(true), Category("Sort Image"), DefaultValue("images/arrow_updn.gif"), Description("Sortable Image")]
public string Sort_Image { get; set; }
//Property : SortExpression
[Browsable(false)]
public string CurrentSortExpression
{
get { return Convert.ToString(ViewState["CurrentSortExpression"]); }
set { ViewState["CurrentSortExpression"] = value.Trim(); }
}
[Browsable(false)]
public string CurrentSortDirection
{
get { return Convert.ToString(ViewState["CurrentSortDirection"]); }
set
{
if (string.IsNullOrEmpty(value))
{
ViewState["CurrentSortDirection"] = "desc";
}
else
{
if (value.ToLower() != "asc" && value.ToLower() != "desc")
{
ViewState["CurrentSortDirection"] = "desc";
}
else
{
ViewState["CurrentSortDirection"] = value.ToString().ToLower();
}
}
}
}
//Property : Multi Show CheckBox
[Category("MultiSelect") , DefaultValue("True")]
public bool AllowMultiSelect
{
get { return bool.Parse(ViewState["AllowMultiSelect"].ToString()); }
set { ViewState["AllowMultiSelect"] = value.ToString(); }
}
[Category("MultiSelect"), DefaultValue(0)]
public int AllowMultiSelectColumn
{
get { return Int32.Parse(ViewState["AllowMultiSelectColumn"].ToString()); }
set { ViewState["AllowMultiSelectColumn"] = value.ToString(); }
}
/*
public string RowSelectFilter
{
get { return (string)ViewState["RowSelectFilter"]; }
set { ViewState["RowSelectFilter"] = value.ToString(); }
}
* */
//Property : Get Selected Items
[Browsable(false)]
public List<GridViewRow> MultiSelectedItem
{
get
{
if (!AllowMultiSelect) return null;
List<GridViewRow> selectedRows = new List<GridViewRow>();
foreach (GridViewRow row in this.Rows)
{
CheckBox cb = (CheckBox)row.Cells[AllowMultiSelectColumn].Controls[0];
if (cb.Checked)
{
selectedRows.Add(row);
}
}
return selectedRows;
}
}
//Define DataSource
private object sourcedata;
public object DataSetSource
{
get
{
if (sourcedata != null)
return sourcedata;
else
return null;
}
set
{
sourcedata = value as object;
}
}
#endregion
private ClientScriptManager csManager;
public xxGridView() : base()
{
AllowPaging = false;
AllowSorting = true;
//GridLines = GridLines.Horizontal;
//BorderWidth = (Unit)0;
// Sort Images Default
Asc_Image = @"images/arrow_up.gif";
Desc_Image = @"images/arrow_down.gif";
Sort_Image = @"images/arrow_updn.gif";
//set event handlers
Init += new EventHandler(On_Init);
Sorting += new GridViewSortEventHandler(On_Sorting);
RowCreated += new GridViewRowEventHandler(On_RowCreated);
}
#region Event Handlers
public event EventHandler GridBindEvent;
public virtual void OnGridBind<T>()
{
if (sourcedata!=null)
{
if (CurrentSortExpression==string.Empty)
{
this.DataSource = sourcedata;
this.DataBind();
return;
}
//Datasource Type
if (sourcedata is DataTable)
{
DataView dv = (sourcedata as DataTable).DefaultView;
if (!string.IsNullOrEmpty(CurrentSortExpression))
dv.Sort = CurrentSortExpression + " " + CurrentSortDirection;
this.DataSource = dv;
this.DataBind();
}
else if (sourcedata is DataSet)
{
DataView dv = (sourcedata as DataSet).Tables[0].DefaultView;
if (!string.IsNullOrEmpty(CurrentSortExpression))
dv.Sort = CurrentSortExpression + " " + CurrentSortDirection;
this.DataSource = dv;
this.DataBind();
}
else if (sourcedata is List<T>)
{
if (!string.IsNullOrEmpty(CurrentSortExpression))
{
Reverser<T> reverser = new Reverser<T>(typeof(T), CurrentSortExpression, CurrentSortDirection);
(sourcedata as List<T>).Sort(reverser);
}
this.DataSource = sourcedata;
this.DataBind();
}
}
}
public void On_Init(object sender, EventArgs e)
{
// processing multi-select
if (ViewState["AllowMultiSelect"]==null || ViewState["AllowMultiSelect"].ToString().Trim()=="")
ViewState["AllowMultiSelect"] = "True";
if (ViewState["AllowMultiSelectColumn"] == null || ViewState["AllowMultiSelectColumn"].ToString().Trim() == "")
ViewState["AllowMultiSelectColumn"] = "0";
csManager = this.Page.ClientScript;
if (AllowMultiSelect)
{
AddSelectColumn();
RegisterJS();
}
// processing sorting...
if (CurrentSortDirection == null || CurrentSortDirection.Trim() == "")
CurrentSortDirection = "desc";
if (CurrentSortExpression == null) CurrentSortDirection = "";
}
public void On_Sorting(object sender , GridViewSortEventArgs e)
{
CurrentSortExpression = e.SortExpression;
if (CurrentSortDirection == "desc")
CurrentSortDirection = "asc";
else
CurrentSortDirection = "desc";
GridBindEvent(this , EventArgs.Empty);
}
public void On_RowCreated(object sender , GridViewRowEventArgs e)
{
string currentSortImage = "";
if (e.Row.RowType==DataControlRowType.Header)
{
foreach (DataControlField field in this.Columns)
{
if (!String.IsNullOrEmpty(field.SortExpression))
{
if (IsSortedByThisField(field.SortExpression))
{
currentSortImage = (CurrentSortDirection == "asc") ? Asc_Image : Desc_Image;
}
else
{
currentSortImage = Sort_Image;
}
AddSortImage(e.Row, this.Columns.IndexOf(field), currentSortImage);
}
}
}
}
#endregion
#region Override Methods
protected override void OnPageIndexChanging(GridViewPageEventArgs e)
{
//base.OnPageIndexChanging(e);
this.PageIndex = e.NewPageIndex;
GridBindEvent(this, EventArgs.Empty);
}
#endregion
#region private helper function
// For Sort
private void AddSortImage(GridViewRow _row, int _colIndex ,string _currImage)
{
if (-1 == _colIndex) return;
Image sortImage = new Image();
sortImage.ImageUrl = _currImage;
_row.Cells[_colIndex].Controls.AddAt(1, sortImage);
}
private bool IsSortedByThisField(String strSortExpression)
{
return CurrentSortExpression.ToLower() == strSortExpression.Trim().ToLower();
}
// for Multi Select
private void AddSelectColumn()
{
TemplateField tc = new TemplateField();
tc.ItemTemplate = new FarGridColumnTemplate();
tc.HeaderTemplate = new FarGridHeaderTemplate();
this.Columns.Insert(AllowMultiSelectColumn, tc);
}
private void RegisterJS()
{
/*
System.Resources.ResourceManager rm = new System.Resources.ResourceManager("xxGridView", Assembly.GetExecutingAssembly());
string _script = rm.GetString("js_selectall");
if (!csManager.IsClientScriptBlockRegistered(this.GetType() , "js_selectall"))
{
csManager.RegisterClientScriptBlock(this.GetType(), "js_selectall", _script);
}
*/
csManager.RegisterClientScriptResource(this.GetType(), "xxWare.xxControls.xxGridViewJS.js");
}
#endregion
}
}