控件使用方法:

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支持数据筛选和自动排序功能相关推荐

  1. 禁用Grid上的自动排序功能

    在标准的Dynamics AX系统中,Grid的每个列头(Column Header)是可以点击的,用户可以通过点击Column Header以实现针对该字段的排序. 但并非所有的情形下,我们都希望G ...

  2. 巧用DBGrid控件的Sort属性实现“点击标题栏自动排序功能”。(改进版本)

    曾看见CSDN文档中有介绍到:通过ADOQuery或其它数据集组件的Sort属性配合DBGrid的OnTitleClick事件,可以方便地实现此功能.因为Sort属性可以让活动数据集按指定的字段进行排 ...

  3. vba 自动排序_学会这个Excel表格技巧之后,立刻实现自动排序,太牛了

    怎么实现自动排序呢?老师从网上下载的2018年各大城市最新平均工资排行表 当我改动其中一个城市的平均工资时,比如广州由7965改为10000,整个表格的顺序会自动调整: 是不是很神奇的样子,怎么做到的 ...

  4. Excel为某一列增加数据筛选

    使用Excel时经常遇到:某一列增加了一个下拉箭头,可以方便地按数值筛选数据. 要让某一列支持数据筛选功能,只需选中该列, 点击菜单栏的 数据-筛选按钮: 以上操作基于Excel2013. 图片和操作 ...

  5. IBM SPSS Statistics教程——多项排序功能详解

    排序功能是数据统计软件必不可少的一项主要功能,当我们在进行缺失值的查找.重复值的查找以及数据排名时,排序功能就显得非常方便有用.掌握好IBM SPSS Statistics的排序功能,是熟练掌握SPS ...

  6. html怎么自动导入数据并排序,JS实现table表格数据排序功能(可支持动态数据+分页效果)...

    asp.net会经常遇到分页的效果,尤其是希望实现静态的html分页排序(html分页相信大家都已经有自己的解决方案.在这里就不多说).我写了一个简单的Demo排序. 数据就是字母和数字两组.(汉字需 ...

  7. 【Magicodes.IE 2.0.0-beta1版本发布】已支持数据表格、列筛选器和Sheet拆分

    为了更好的完善Magicodes.IE,春节期间我们会进行一次大的重构.由于精力有限,急缺文档和翻译(将文档翻译为英文文档)支持,诚邀各位加入.同时在功能方便也做了相关规划,有兴趣的朋友可以参与提交P ...

  8. 计算机基础---03Excel篇(入门,身份证筛选出生年月,自动填充功能,表格排序,自动筛选,高级筛选,数据有效性,求和)

    1.Excel 1.1 快速入门 说明一:一个Excel工作簿可以有很多工作表,点击+可以添加工作表: 工作表重命名:双击或者右键重命名. 给工作表标签添加颜色:不同的工作表标签可以代表轻重缓急,代表 ...

  9. php表格单元格怎么实现排序,excel表格数据怎么自动排列-excel表格如何实现自动排序...

    excel表格如何实现自动排序 1.首先打excel表格,在第一个单中输入星期,如图所示. 2.在单元格下面的单元入星期一,鼠标放在星期一单元格的右下角. 3.完成以上步骤后,鼠标不放,即自动排序出现 ...

最新文章

  1. CN.Text开发笔记—利用反射将数据读入实体类
  2. [转]HTTPS网络流量解密方法探索系列(一)
  3. cuda nvprof 输出结果的理解和优化空间
  4. 供来宾访问计算机打开安全吗,计算机安全设置操作手册(22页)-原创力文档
  5. java9 堆外内存_java堆外内存泄漏排查
  6. matlab 曲线拟合求导,基于matlab曲线拟合的数据预测分析
  7. html页面底部白条,用cookie解决新版微信中H5页面底部白条问题
  8. 编写高质量代码改善C#程序的157个建议——建议9: 习惯重载运算符
  9. javascript 开发多种类型的应用(Electron 跨平台开发)
  10. 云服务器和虚拟主机的区别
  11. 蓝桥杯题库及答案python版_蓝桥杯试题库的历届真题版.doc
  12. 【教程】python递归三部曲(基于turtle实现可视化)-一、谢尔宾斯基三角形
  13. 如何快速构建社交APP中的语音房
  14. MATLAB并行计算
  15. java通过代理使用redis,redis自动关闭连接,释放资源
  16. 码农+码农=码农 ?
  17. freecodecamp_freeCodeCamp如何使我成为最新的训练营毕业生
  18. Angular 4入门教程系列:9:TypeScript:ECMAScript之前世今生
  19. Arch的双显卡驱动
  20. 有关于投资最优化的模型求解

热门文章

  1. 51单片机指针c语言,单片机C语言教程:C51指针的使用
  2. mysql 大量数据 更改索引_MySql——来自狂神说Java - 贤贤贤sir
  3. 视图单行子查询返回mysql,Oracle命令整理 - osc_sj1kgo4z的个人空间 - OSCHINA - 中文开源技术交流社区...
  4. 图像有用区域(广搜)
  5. HDU-Keywords Search(AC自动机)
  6. 机器学习-K近邻项目实战
  7. 嵌入式开发之视频压缩比---h264、mjpeg、mpeg4
  8. 不止是安防 红外摄像机在应急产业的应用
  9. Problem C: 默认参数:求圆面积
  10. MySQL 5.6, 5.7并行复制测试(二)(r12笔记第10天)