重写GridView,支持CheckBox选择,List排序等等...

重新封装了一个 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

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值