使用 DataTable 的通用 GridView,支持排序和分页






4.11/5 (5投票s)
这个扩展控件提供了排序和分页功能。
引言
在我以前的 文章 中,我介绍了 XGrid 控件,它只是一个扩展的 GridView
,提供通用的列排序和分页。
GridView
(以 DataTable
或 DataSet
作为 DataSource
)排序和分页问题的读者,请快速下载并运行代码,稍后再阅读或停止阅读。对于有耐心的读者,让我们从
背景
控件的大部分代码库来自 Alex Furmanski 的 带有插入功能的扩展 GridView。排序和分页的想法来自 Strong Coders。格式化的想法来自 Mike Ellison 的 格式化 ASP.NET Grid 中的 AutoGenerateColumns。因此,我想感谢那些分享他们精彩想法的人,并尝试总结/添加一些额外的东西,例如实现一个真正通用的 GridView
的便利性。对于法律免责声明爱好者——我有一个坏习惯,会在凌晨 3 点复制粘贴并玩弄代码,所以如果你发现你的代码或别人的代码,请给我发邮件,我会修复它……
对于图片爱好者——一旦我重新安装好我的环境(24 小时内),我会放一张简单的快照,展示一个简单的 XGrid 的样子。
在本文的上下文中,我说的通用是什么意思?它为什么如此重要?当然,不是 C#泛型类型的“通用”,而是一个具有以下功能的 GridView
- 呈现已作为
DataSource
提供的任何DataTable
/DataSet
- 处理自动排序
- 处理自动分页——您不必在页面的代码隐藏中应用排序处理程序(如果数据源是
DataSet
或DataTable
) - 具有可以动态设置的页面大小
- 分页器具有“第一页”、“上一页”、“下一页”、“最后一页”链接——同时它还会生成从当前页面开始的 -10 ..+10 链接
- 该代码提供了一个关于如何格式化 XGrid 行的基本指南
使用代码
您不需要任何数据库(Northwind、AdventureWorks 等)进行设置——数据表在示例页面的代码隐藏中生成。下载项目,然后在 VS 中打开。打开网站(如果您使用 VS2008,请点击解决方案文件;如果您使用的是较旧的 VS 版本,请开始 - 运行 - devenv.exe - 文件 - 打开 - 网站)并导航到您刚刚解压到的文件夹。按 F5。检查 CreateDynamicControls()
方法——这是您应该创建动态 GridView
(或者事实上所有动态控件)的地方,但这完全是另一篇文章的主题,所以如果您确实想要一个动态 GridView
,您可以复制粘贴此页面代码隐藏,并将其用作使用动态 GridView
的代码隐藏页面的模板。请注意,XGrid 只是粘贴在 App_Code 文件夹中,因此您可以简单地将其复制粘贴到您的项目中来使用它(无需在 bin 文件夹中单独的 DLL!)。以下是使用该控件的示例代码片段
Gui.Controls.XGrid gv = new Gui.Controls.XGrid ();
gv.DataSource = Session ["dt"]; //take the datatable from the session
//or assign it straight
gv.AllowSorting = true; //enable sorting
gv.ShowResultSummary = true; //set the "showing page n out of y number of pages
gv.PageSize = 3; //how many items per page should be presented
gv.AllowPaging = true; //enable pages
gv.AutoGenerateColumns = true; // do not care about column names
gv.DataBind ( ); //databind otherwise nothing would happen !!!
panGvHolder.Controls.Add ( gv ); //add the control dynamically
请记住,在一个页面上显示超过 5000 行 GridView
没有太大意义——无论连接速度如何,您都会在客户端遇到一些性能问题(用户浏览器在渲染时会出现问题……)。
值得关注的方面和未来方向
我注意到如果列标题中有空格,排序将不起作用(会引发异常)——到目前为止,我还没有需要带有空格的列标题,但弄清楚如何修复这个不便之处会很好。
目前,我使用外部标签和文本框来设置 GridView
的大小,并在页面中使用事件处理程序。如果有人有可集成到控件中的工作代码,请与大家分享。
我目前正在致力于一个通用的 ORM GRUD 实现——我所说的通用,是指我希望能够只向 GridView
指定数据源,它就能调用正确的 GRUD 代码(存储过程或生成的 SQL)。MSDN 上的这篇 文章 可以是实现的一个很好的起点。
顶行搜索功能会很不错。以通用方式指定数据库钻取的方法(实际上可以实现一种,但它不通用,因此不适用于分享!)。
关于编辑、更新的通用对话框——位图->单选按钮,外键->下拉列表……等等。
欢迎评论和反馈
即使是负面评论,也很受欢迎。CodeProject 是关于贡献和分享的——本着这种精神,明确说明投票少于 4 的原因被认为是一种赞扬。很多次,我在 Google 上搜索某个问题的答案,而不是重新发明轮子,都能从这里起源的代码快速启动新项目,并实现我问题的解决方案,这希望也能通过本文实现,如果不能,阅读原因对所有读者(甚至是我)都是有益的。
更新
我不得不重写整篇文章——上传功能在 Chrome 中不起作用,这搞乱了整篇文章,所以我为丢失的评论道歉。有一些关于需要控件的简单快照的评论,一旦我重新安装好我的整个环境,它就会被提供。