ASP.NET GridView动态显示隐藏列,并保存客户的配置(用户控件Cookie版)

来源:互联网 发布:阿里云按量付费 没有了 编辑:程序博客网 时间:2024/06/05 19:34

示例源码:Download


ASP.NET开发中,会遇到有些客户提出这样需求,可根据需求编辑GridView列显示以及隐藏,这个用户控件就是为了这个需求而生。
自动从GridView中获取所有Visible=true的列,加入到CheckBoxList,并配合Cookie实现本次配置后,下次依然有效。

应用场景效果图:



使用指南:

1、引用用户控件

2、后台初始化用户控件,Page_Load方法体实现委托,传入目标GridView

protected void Page_Load(object sender, EventArgs e){    this.ucGridViewLayout.SelectedIndexChangedEvent += new Unisoft.ICS.Web.UserControls.Common.GridViewLayout.EventDelegate(ucGridViewLayout_SelectedIndexChangedEvent);    if (!Page.IsPostBack)    {        //GridView绑定        //初始化用户控件        this.ucGridViewLayout.BindGridViewColumn(this.gvProductList);    }}//控件回调执行更新列void ucGridViewLayout_SelectedIndexChangedEvent(){    this.ucGridViewLayout.UpdateGridViewColumn(this.gvProductList);    this.uppProductList.Update();//如果GridView包了一层局部刷新,则需要执行更新}

新建用户控件GridViewLayout.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="GridViewLayout.ascx.cs" Inherits="Unisoft.ICS.Web.UserControls.Common.GridViewLayout" %><asp:UpdatePanel ID="uppGridViewShow" runat="server" UpdateMode="Conditional">    <ContentTemplate>        <asp:CheckBoxList ID="ChkGridViewColumnList" runat="server" RepeatDirection="Horizontal"            Width="100%" RepeatColumns="14" RepeatLayout="Table" AutoPostBack="true" OnSelectedIndexChanged="ChkGridViewColumnList_SelectedIndexChanged">        </asp:CheckBoxList>    </ContentTemplate></asp:UpdatePanel>
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Unisoft.ICS.Utility.Web;using Unisoft.ICS.Model.CommonEntity;namespace Unisoft.ICS.Web.UserControls.Common{    public partial class GridViewLayout : System.Web.UI.UserControl    {        /// <summary>        /// 当前页唯一的CookieName        /// </summary>        private string HttpCookie_Name        { get { return Security.DESEncrypt("GridViewLayout_ASCX_" + this.ChkGridViewColumnList.ClientID); } }        /// <summary>        /// 定义委托        /// </summary>        public delegate void EventDelegate();        /// <summary>        /// 定义值改变事件        /// </summary>        public event EventDelegate SelectedIndexChangedEvent;        protected void Page_Load(object sender, EventArgs e)        {        }        /// <summary>        ///从GridView读取所有列信息,并生成绑定到ChkGridViewColumnList控件        /// </summary>        /// <param name="_gridview">目标GridView</param>        public void BindGridViewColumn(GridView _gridview)        {            if (_gridview.Rows.Count > 0)            {                List<HttpCookies> cookies = new List<HttpCookies>();                if (Request.Cookies[this.HttpCookie_Name] != null)                {                    cookies = JsonHelper.FromJson<List<HttpCookies>>(Request.Cookies[this.HttpCookie_Name].Value);                }                this.ChkGridViewColumnList.Items.Clear();                for (int i = 0; i < _gridview.Columns.Count; i++)                {                    if (_gridview.Columns[i].Visible)                    {                        ListItem _this = new ListItem(_gridview.Columns[i].HeaderText, i.ToString());                        //从Cookie中获取配置                        List<HttpCookies> _cookie = cookies.Where(n => n.HttpCookie_Index == i && n.HttpCookie_Text == _gridview.Columns[i].HeaderText).ToList<HttpCookies>();                        if (cookies != null && cookies.Count > 0 && _cookie.Count > 0)                        {                            _this.Selected = _cookie[0].HttpCookie_Selected;//将Cookie中的配置赋值到CheckBox                            _gridview.Columns[i].Visible = _this.Selected;//同步GridView列                        }                        else                        {                            //默认选中                            _this.Selected = true;                        }                        this.ChkGridViewColumnList.Items.Add(_this);                    }                }            }        }        /// <summary>        ///从GridView读取所有列信息,并生成绑定到ChkGridViewColumnList控件        /// </summary>        /// <param name="_gridview">目标GridView</param>        /// <param name="RepeatColumns">单行显示数量:值<0,默认每行14列</param>        public void BindGridViewColumn(GridView _gridview, int RepeatColumns)        {            if (_gridview.Rows.Count > 0)            {                if (RepeatColumns > 0)                { this.ChkGridViewColumnList.RepeatColumns = RepeatColumns; }                //从Cookie中获取当前页的配置Json,并转换成List<HttpCookies>                List<HttpCookies> cookies = new List<HttpCookies>();                if (Request.Cookies[this.HttpCookie_Name] != null)                { cookies = JsonHelper.FromJson<List<HttpCookies>>(Request.Cookies[this.HttpCookie_Name].Value); }                //清空CheckBoxList-ListItem                this.ChkGridViewColumnList.Items.Clear();                for (int i = 0; i < _gridview.Columns.Count; i++)                {                    //GridView可视列                    if (_gridview.Columns[i].Visible)                    {                        //将GridView Column追加到CheckBoxList                        ListItem _this = new ListItem(_gridview.Columns[i].HeaderText, i.ToString());                        //从Cookie中获取配置                        List<HttpCookies> _cookie = cookies.Where(n => n.HttpCookie_Index == i && n.HttpCookie_Text == _gridview.Columns[i].HeaderText).ToList<HttpCookies>();                        if (cookies != null && cookies.Count > 0 && _cookie.Count > 0)                        {                            //将Cookie中的配置赋值到CheckBox                            _this.Selected = _cookie[0].HttpCookie_Selected;                            //显示状态同步到GridView列                            _gridview.Columns[i].Visible = _this.Selected;                        }                        else                        {                            //默认选中                            _this.Selected = true;                        }                        //将ListItem追加到CheckBoxList中                        this.ChkGridViewColumnList.Items.Add(_this);                    }                }            }        }        /// <summary>        /// 控制GridView列显示隐藏事件        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        protected void ChkGridViewColumnList_SelectedIndexChanged(object sender, EventArgs e)        {            List<HttpCookies> cookies = new List<HttpCookies>();            foreach (ListItem item in ChkGridViewColumnList.Items)            {                //将CheckBoxList的显示状态写入Cookie中                HttpCookies _entity = new HttpCookies();                _entity.HttpCookie_Index = Convert.ToInt32(item.Value);                _entity.HttpCookie_Text = item.Text;                _entity.HttpCookie_Selected = item.Selected;                cookies.Add(_entity);            }            //将配置转换成son,并写入Cookie            HttpCookie cookie = new HttpCookie(HttpCookie_Name, JsonHelper.ToJson<List<HttpCookies>>(cookies));            cookie.Expires = DateTime.Now.AddMonths(6);//Cookie保存6个月            Response.Cookies.Add(cookie);            if (SelectedIndexChangedEvent != null)            {                this.SelectedIndexChangedEvent();            }        }        /// <summary>        /// 更新GridView控件,根据勾选值控制列显示或隐藏        /// </summary>        public void ChkGridViewColumnList_UpdateGridViewColumn(GridView _gridview)        {            //循环读取CheckBoxList ListItem的显示状态            foreach (ListItem item in ChkGridViewColumnList.Items)            {                //将CheckBoxList ListItem的显示状态,同步到GridView Column                _gridview.Columns[Convert.ToInt32(item.Value)].Visible = item.Selected;            }        }        /// <summary>        /// 更新GridView控件,根据勾选值控制列显示或隐藏,并将配置写入Cookie中        /// </summary>        public void UpdateGridViewColumn(GridView _gridview)        {            foreach (ListItem item in ChkGridViewColumnList.Items)            {                _gridview.Columns[Convert.ToInt32(item.Value)].Visible = item.Selected;            }        }    }}

新增HttpCookies类用于Json序列化

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Unisoft.ICS.Model.CommonEntity{    /// <summary>    /// HttpCookies    /// </summary>    public class HttpCookies    {        public int HttpCookie_Index;        public string HttpCookie_Text;        public bool HttpCookie_Selected;    }}
JsonHelper.cs
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Runtime.Serialization.Json;using Newtonsoft.Json;using System.Data;using System.Web.Script.Serialization;using System.Text.RegularExpressions;namespace Unisoft.ICS.Utility.Web{    public static class JsonHelper    {        private readonly static JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();        /// <summary>        /// 生成Json格式        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="obj"></param>        /// <returns></returns>        public static string GetJson<T>(T obj)        {            DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());            using (MemoryStream stream = new MemoryStream())            {                json.WriteObject(stream, obj);                string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;            }        }        /// <summary>        /// 获取Json的Model        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="szJson"></param>        /// <returns></returns>        public static T ParseFromJson<T>(string szJson)        {            T obj = Activator.CreateInstance<T>();            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))            {                DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());                return (T)serializer.ReadObject(ms);            }        }        public static string DataTableToJSON(DataTable dt, string dtName)        {            StringBuilder sb = new StringBuilder();            StringWriter sw = new StringWriter(sb);            using (JsonWriter jw = new JsonTextWriter(sw))            {                JsonSerializer ser = new JsonSerializer();                jw.WriteStartObject();                jw.WritePropertyName(dtName);                jw.WriteStartArray();                foreach (DataRow dr in dt.Rows)                {                    jw.WriteStartObject();                    foreach (DataColumn dc in dt.Columns)                    {                        jw.WritePropertyName(dc.ColumnName);                        ser.Serialize(jw, dr[dc].ToString());                    }                    jw.WriteEndObject();                }                jw.WriteEndArray();                jw.WriteEndObject();                sw.Close();                jw.Close();            }            return sb.ToString();        }        /// <summary>        /// 将 T 对象转为 Json 字符串        /// </summary>        /// <param name="jsonObj"></param>        /// <returns></returns>        public static string ToJson<T>(T jsonObj)        {            var _jsonstring = jsonSerializer.Serialize(jsonObj);            var _regex = new Regex(@"\\/Date\((?<date>\d+)\)\\/");            var _match = _regex.Match(_jsonstring);            int _add = 0;            while (_match.Success)            {                var _tmp = _jsonstring.Remove(_match.Index + _add, _match.Length);                var _mid = "new Date(" + _match.Groups["date"] + ")";                _jsonstring = _tmp.Insert(_match.Index + _add, _mid);                _add += _mid.Length - _match.Length;                _match = _match.NextMatch();            }            return _jsonstring;        }        /// <summary>        /// 将 Json 字符串转为 Json 对象        /// </summary>        /// <param name="jsonString"></param>        /// <returns></returns>        public static T FromJson<T>(string jsonString)        {            return jsonSerializer.Deserialize<T>(jsonString);        }        #region DataTable序列化json        /// <summary>         /// DataTable转为json         /// </summary>         /// <param name="dt">DataTable</param>         /// <returns>json数据</returns>         public static string DataTableToJson(DataTable dt)        {            List<Dictionary<string, object>> list = new List<Dictionary<string, object>>();            foreach (DataRow dr in dt.Rows)            {                Dictionary<string, object> result = new Dictionary<string, object>();                foreach (DataColumn dc in dt.Columns)                {                    result.Add(dc.ColumnName, dr[dc]);                }                list.Add(result);            }            return SerializeDataTableToJson(list);        }        /// <summary>        /// 序列化对象为Json字符串        /// </summary>        /// <param name="obj">要序列化的对象</param>        /// <param name="recursionLimit">序列化对象的深度,默认为100</param>        /// <returns>Json字符串</returns>        public static string SerializeDataTableToJson(this object obj)        {            JavaScriptSerializer serialize = new JavaScriptSerializer();            serialize.RecursionLimit = 100;            return serialize.Serialize(obj);        }        #endregion    }}

引用代码

<%@ Register src="../../UserControls/Common/GridViewLayout.ascx" tagname="GridViewLayout" tagprefix="uc" %>
<uc:GridViewLayout ID="ucGridViewLayout" runat="server" /><asp:UpdatePanel ID="uppPanel" runat="server" UpdateMode="Conditional">    <ContentTemplate>                <asp:GridView ID="GridView" runat="server">                    <EmptyDataTemplate>                        <span class="noRecord">没有记录!</span>                    </EmptyDataTemplate>                </asp:GridView>            </div>        </asp:Panel>    </ContentTemplate></asp:UpdatePanel>
protected void Page_Load(object sender, EventArgs e){    //实现控件委托     this.ucGridViewLayout.SelectedIndexChangedEvent += new Unisoft.ICS.Web.UserControls.Common.GridViewLayout.EventDelegate(ucGridViewLayout_SelectedIndexChangedEvent);     if (!Page.IsPostBack)     {        //绑定GridView业务代码this.BindProductList(); //初始化用户控件 this.ucGridViewLayout.BindGridViewColumn(GridView);//传入GridView ID }}//绑定GridView业务代码protected void BindProductList(){this.gvProductList.DataSource = 数据源;this.gvProductList.DataBind();     this.ucGridViewLayout.UpdateGridViewColumn(this.gvProductList);} //控件回调执行更新列void ucGridViewLayout_SelectedIndexChangedEvent(){     this.ucGridViewLayout.UpdateGridViewColumn(this.gvProductList);     this.uppPanel.Update();}    <asp:UpdatePanel ID="uppPanel" runat="server" UpdateMode="Conditional">        <ContentTemplate>                    <asp:GridView ID="GridView" runat="server">                        <EmptyDataTemplate>                            <span class="noRecord">没有记录!</span>                        </EmptyDataTemplate>                    </asp:GridView>                </div>            </asp:Panel>        </ContentTemplate>    </asp:UpdatePanel> /// <summary>/// 导出/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void lbtnOutput_Click(object sender, EventArgs e){    IsOutput = true;    this.BindProductList();    this.ucGridViewLayout.UpdateGridViewColumn(this.gvProductList);    ToExcel(this.Panel1, "库存台账" + DateTime.Now.ToString("yyyy-MM-dd"));}/// <summary>/// 导出到EXCEL/// </summary>/// <param name="ctl"></param>/// <param name="FileName"></param>public void ToExcel(System.Web.UI.Control ctl, string FileName){    //火狐浏览器下导出Excel文件时,文件名转码,可防止中文出现乱码(其它浏览器转码反而会乱码)    if (!string.IsNullOrEmpty(FileName) && !(HttpContext.Current.Request.UserAgent != null && HttpContext.Current.Request.UserAgent.ToUpper().IndexOf("FIREFOX", StringComparison.Ordinal) != -1))    { FileName = System.Web.HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8); }    HttpContext.Current.Response.Charset = "UTF-8"; // 或UTF-7 以防乱码    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;    HttpContext.Current.Response.ContentType = "application/vnd.ms-excel";    HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + FileName + ".xls");    ctl.Page.EnableViewState = false;    System.IO.StringWriter tw = new System.IO.StringWriter();    System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);    ctl.RenderControl(hw);    HttpContext.Current.Response.Write(tw.ToString());    HttpContext.Current.Response.End();    ctl.Page.EnableViewState = false;}
1 0
原创粉丝点击