重写GridView支持数据筛选和自动排序功能
控件使用方法:
1.在页面Page_Load()方法的!Page.IsPostBack外面重新绑定数据源,即为DataSource赋值,因为页面回传时!Page.IsPostBack内的方法不会执行,先前赋值的DataSource为null。
2.将AllowSelecting属性设置为true
3.将AllowSorting属性设置为true,并为SortExpression赋值
筛选数据前图:
回车,筛选数据后图:
实现代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Text; 5 using System.Web; 6 using System.Web.UI; 7 using System.Web.UI.WebControls; 8 using System.Collections; 9 using System.Data; 10 using System.Reflection; 11 using System.Drawing.Design; 12 13 namespace WebCustomControls 14 { 15 public class SupperGridView : System.Web.UI.WebControls.GridView 16 { 17 private Dictionary<string, string> dic = new Dictionary<string, string>(); 18 private GridViewRow selectorRow; 19 20 public SupperGridView() 21 : base() 22 { } 23 24 [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden),Browsable(false)] 25 public GridViewRow SelectorRow 26 { 27 get 28 { 29 if (selectorRow == null) 30 { 31 this.EnsureChildControls(); 32 } 33 return this.selectorRow; 34 } 35 } 36 37 [DefaultValue(false)] 38 public bool AllowSelecting 39 { 40 get 41 { 42 object o = ViewState["Selecting"]; 43 44 if (o != null) 45 { 46 return (bool)o; 47 } 48 return false; 49 } 50 set 51 { 52 ViewState["Selecting"] = value; 53 } 54 } 55 56 protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding) 57 { 58 int num= base.CreateChildControls(dataSource, dataBinding); 59 60 if (dataSource != null && AllowSelecting) 61 { 62 CreateSelectedRow(); 63 } 64 65 return num; 66 } 67 68 // 创建数据筛选行 69 protected virtual void CreateSelectedRow() 70 { 71 if (this.Controls.Count != 0) 72 { 73 dic.Clear(); 74 Table table = (Table)this.Controls[0]; 75 TableRowCollection rows = table.Rows; 76 selectorRow = CreateRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal); 77 selectorRow.ID = "SelectRow"; 78 TableCellCollection cells = selectorRow.Cells; 79 80 for (int i = 0; i < Columns.Count; i++) 81 { 82 TableCell cell = new TableCell(); 83 TextBox box = new TextBox(); 84 box.ID = "box" + i; 85 box.BorderStyle = BorderStyle.None; 86 box.AutoPostBack = true; 87 box.TextChanged += new EventHandler(box_TextChanged); 88 89 cell.Controls.Add(box); 90 cells.AddAt(i, cell); 91 dic.Add(box.ID, Columns[i].HeaderText); 92 } 93 rows.AddAt(1, selectorRow); 94 } 95 } 96 97 private void box_TextChanged(object sender, EventArgs e) 98 { 99 if (DataSource == null) return;100 101 TextBox box = (TextBox)sender;102 DataTable table = SelectDataFromTextBox(box);103 104 if (table.Rows.Count == 0)105 {106 Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.GetType().FullName, "alert('对不起,没有您搜索的记录!')", true);107 return;108 }109 110 DataSource = table;111 DataBind();112 }113 114 //筛选数据逻辑,用linq实现可能给方便115 protected virtual DataTable SelectDataFromTextBox(TextBox box)116 {117 DataTable oldTable = ConvertToDataTable(GetData());118 DataTable newTable = oldTable.Clone();119 DataRow[] rows = null;120 Type columnDataType = oldTable.Columns[dic[box.ID]].DataType;121 122 // Column.DataType是string类型123 if (columnDataType == typeof(string))124 {125 rows = oldTable.Select("" + dic[box.ID] + " like '%" + box.Text + "%'");126 }127 // Column.DataType非string类型128 else129 {130 rows = oldTable.Select("" + dic[box.ID] + "='" + box.Text + "'");131 }132 133 foreach (DataRow row in rows)134 {135 newTable.Rows.Add(row.ItemArray);136 }137 return newTable;138 }139 140 //将IEnumerable数据类型转换成DataTable数据类型141 protected virtual DataTable ConvertToDataTable(IEnumerable data)142 {143 DataTable dtReturn = new DataTable();144 145 foreach (object item in data)146 {147 PropertyDescriptorCollection props = TypeDescriptor.GetProperties(item);148 149 foreach (PropertyDescriptor p in props)150 {151 if (!dtReturn.Columns.Contains(p.Name))152 {153 dtReturn.Columns.Add(new DataColumn(p.Name, p.PropertyType));154 }155 }156 157 DataRow row = dtReturn.NewRow();158 159 foreach (PropertyDescriptor p in props)160 {161 row[p.Name] = p.GetValue(item);162 }163 164 dtReturn.Rows.Add(row);165 }166 return dtReturn;167 }168 169 //获取数据源,覆盖并重新实现父类方法 170 protected new IEnumerable GetData()171 {172 DataSourceView dataSourceView = base.GetData();173 Type type = dataSourceView.GetType();174 MethodInfo method = type.GetMethod("ExecuteSelect", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);175 176 if (method == null) return null;177 178 object[] args = new object[] { DataSourceSelectArguments.Empty };179 object result = method.Invoke(dataSourceView, args);180 181 return (IEnumerable)result;182 }183 184 //为数据筛选行添加样式185 protected override void PrepareControlHierarchy()186 {187 base.PrepareControlHierarchy();188 189 if (this.Controls.Count != 0)190 {191 foreach (TableCell cell in selectorRow.Cells)192 {193 if (cell != null && HeaderStyle != null)194 {195 cell.MergeStyle(HeaderStyle);196 }197 }198 }199 }200 201 //重写排序方法 202 protected override void OnSorting(GridViewSortEventArgs e)203 {204 base.OnSorting(e);205 206 if (DataSource == null) return;207 208 DataView dataView = ConvertToDataTable(GetData()).DefaultView;209 210 ViewState["sortexpression"] = e.SortExpression;211 212 if (ViewState["sortdirection"] == null)213 {214 ViewState["sortdirection"] = "asc";215 }216 else217 {218 if (ViewState["sortdirection"].ToString() == "asc")219 {220 ViewState["sortdirection"] = "desc";221 }222 else223 {224 ViewState["sortdirection"] = "asc";225 }226 }227 228 if (ViewState["sortexpression"] != null)229 {230 dataView.Sort = ViewState["sortexpression"].ToString() + " " + ViewState["sortdirection"].ToString();231 }232 233 DataSource = dataView;234 DataBind();235 }236 }237 }
转载于:https://www.cnblogs.com/chenlinfei/archive/2011/12/12/2284885.html
重写GridView支持数据筛选和自动排序功能相关推荐
- 禁用Grid上的自动排序功能
在标准的Dynamics AX系统中,Grid的每个列头(Column Header)是可以点击的,用户可以通过点击Column Header以实现针对该字段的排序. 但并非所有的情形下,我们都希望G ...
- 巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能”。(改进版本)
曾看见CSDN文档中有介绍到:通过ADOQuery或其它数据集组件的Sort属性配合DBGrid的OnTitleClick事件,可以方便地实现此功能.因为Sort属性可以让活动数据集按指定的字段进行排 ...
- vba 自动排序_学会这个Excel表格技巧之后,立刻实现自动排序,太牛了
怎么实现自动排序呢?老师从网上下载的2018年各大城市最新平均工资排行表 当我改动其中一个城市的平均工资时,比如广州由7965改为10000,整个表格的顺序会自动调整: 是不是很神奇的样子,怎么做到的 ...
- Excel为某一列增加数据筛选
使用Excel时经常遇到:某一列增加了一个下拉箭头,可以方便地按数值筛选数据. 要让某一列支持数据筛选功能,只需选中该列, 点击菜单栏的 数据-筛选按钮: 以上操作基于Excel2013. 图片和操作 ...
- IBM SPSS Statistics教程——多项排序功能详解
排序功能是数据统计软件必不可少的一项主要功能,当我们在进行缺失值的查找.重复值的查找以及数据排名时,排序功能就显得非常方便有用.掌握好IBM SPSS Statistics的排序功能,是熟练掌握SPS ...
- html怎么自动导入数据并排序,JS实现table表格数据排序功能(可支持动态数据+分页效果)...
asp.net会经常遇到分页的效果,尤其是希望实现静态的html分页排序(html分页相信大家都已经有自己的解决方案.在这里就不多说).我写了一个简单的Demo排序. 数据就是字母和数字两组.(汉字需 ...
- 【Magicodes.IE 2.0.0-beta1版本发布】已支持数据表格、列筛选器和Sheet拆分
为了更好的完善Magicodes.IE,春节期间我们会进行一次大的重构.由于精力有限,急缺文档和翻译(将文档翻译为英文文档)支持,诚邀各位加入.同时在功能方便也做了相关规划,有兴趣的朋友可以参与提交P ...
- 计算机基础---03Excel篇(入门,身份证筛选出生年月,自动填充功能,表格排序,自动筛选,高级筛选,数据有效性,求和)
1.Excel 1.1 快速入门 说明一:一个Excel工作簿可以有很多工作表,点击+可以添加工作表: 工作表重命名:双击或者右键重命名. 给工作表标签添加颜色:不同的工作表标签可以代表轻重缓急,代表 ...
- php表格单元格怎么实现排序,excel表格数据怎么自动排列-excel表格如何实现自动排序...
excel表格如何实现自动排序 1.首先打excel表格,在第一个单中输入星期,如图所示. 2.在单元格下面的单元入星期一,鼠标放在星期一单元格的右下角. 3.完成以上步骤后,鼠标不放,即自动排序出现 ...
最新文章
- CN.Text开发笔记—利用反射将数据读入实体类
- [转]HTTPS网络流量解密方法探索系列(一)
- cuda nvprof 输出结果的理解和优化空间
- 供来宾访问计算机打开安全吗,计算机安全设置操作手册(22页)-原创力文档
- java9 堆外内存_java堆外内存泄漏排查
- matlab 曲线拟合求导,基于matlab曲线拟合的数据预测分析
- html页面底部白条,用cookie解决新版微信中H5页面底部白条问题
- 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
- javascript 开发多种类型的应用(Electron 跨平台开发)
- 云服务器和虚拟主机的区别
- 蓝桥杯题库及答案python版_蓝桥杯试题库的历届真题版.doc
- 【教程】python递归三部曲(基于turtle实现可视化)-一、谢尔宾斯基三角形
- 如何快速构建社交APP中的语音房
- MATLAB并行计算
- java通过代理使用redis,redis自动关闭连接,释放资源
- 码农+码农=码农 ?
- freecodecamp_freeCodeCamp如何使我成为最新的训练营毕业生
- Angular 4入门教程系列:9:TypeScript:ECMAScript之前世今生
- Arch的双显卡驱动
- 有关于投资最优化的模型求解
热门文章
- 51单片机指针c语言,单片机C语言教程:C51指针的使用
- mysql 大量数据 更改索引_MySql——来自狂神说Java - 贤贤贤sir
- 视图单行子查询返回mysql,Oracle命令整理 - osc_sj1kgo4z的个人空间 - OSCHINA - 中文开源技术交流社区...
- 图像有用区域(广搜)
- HDU-Keywords Search(AC自动机)
- 机器学习-K近邻项目实战
- 嵌入式开发之视频压缩比---h264、mjpeg、mpeg4
- 不止是安防 红外摄像机在应急产业的应用
- Problem C: 默认参数:求圆面积
- MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)