扩展 DataGridView






4.65/5 (30投票s)
对DataGridView进行一些小的修改以进行改进。
引言
DataGridView
是一个强大的控件,但它缺少一些功能。其中一些功能包括:快速搜索数据的方法,显示/隐藏列的能力,导出数据以及键盘快捷键。
搜索
我想要一个非常易于使用的搜索功能。我也希望它能在您输入时进行搜索。因此,我从Firefox那里获得了灵感。底部有一个小条,里面有一个输入框。逻辑很简单。在排序的字段中搜索文本。要调出搜索,请从标题上下文菜单中选择它,或者按 ` (Tab键上方)。
显示/隐藏列
当向用户显示数据时,通常会有一些高级数据用户可以查看,但默认情况下是隐藏的。因此,通过我的控件,您只需单击标题即可选择显示和隐藏列。如果您不希望用户能够为特定网格执行此操作,只需使用
AllowAddRemoveColumns = false;
导出数据
如果网格可以导出到Excel,那么它将更有用。我使用了Microsoft Office 2003 Primary Interop Assemblies(必须安装在客户端上),它将导入Office 2003和2007。如果未安装,该选项将更改为导出到CSV。Microsoft Office 2003 Primary Interop Assemblies的一个问题是,Office必须安装才能构建解决方案。为了解决这个问题,我使用了大量的反射,但所有这些都在包装类中,以保持代码整洁。
此选项可以在标题的上下文菜单中找到。
键盘快捷键
排序和显示/隐藏列的能力将对高级用户更有用,如果他们可以从键盘上进行操作。但我希望它也很直观。因此,当您按下Control键时,列号就会出现 - 这些将是我们用于快捷键的。Control + 列号将对该列进行排序,Control + Alt + 列号将显示/隐藏该列。另一个重要的快捷键是,如上所述,` 键(Tab键上方,shift值为~)用于搜索。
列编辑器
这是1.0.2版本中添加的一个功能。也许普通DataGridView中最令人讨厌的部分是它的列编辑器。它的大部分功能都很好。问题是对话框太小,您必须调整它的大小。然后关闭它,再次打开它,又要调整大小。这只是一个小问题,但它比Visual Studio中的任何事情都更能惹恼我(我不是一个人!)。由于微软还没有解决这个问题(我可以指出,他们只需要不到10分钟就可以解决),我决定自己解决。
对ExtendedDataGridView
的更改非常少 - 您只需要两个属性,第一个是在类上[DesignerAttribute(typeof(ExtendedDataGridViewDesigner))]
,第二个是在Columns
属性上[Editor(typeof(ExtendedDataGridViewColumnCollectionEditor), typeof(UITypeEditor))]
。这些Attribute引用的类是大部分工作完成的地方。
ExtendedDataGridViewColumnCollectionEditor
是最重要的。代码非常相似(并且基于)System.Design
中的DataGridViewColumnCollectionEditor
。主要问题是我们需要的访问是标记为internal(DataGridViewColumnCollectionDialog
)的程序集中的类。因此,我们必须使用反射来获取它。DataGridViewColumnCollectionDialog
继承自Form
,因此当我们获取对象时,我们将把它作为一个Form来处理 - 这就是我们所需要的。我们可以轻松地将MaximizeBox
属性设置为true,并且可以轻松地获取和设置Location
和Size
。
还有一个诀窍,DataGridViewColumnCollectionDialog
中有一个小的bug。通常情况下,它几乎不引人注意,但当我们给它一个较大的初始大小时,它会非常令人讨厌。问题在于它不能很好地从初始大小收缩。它能很好地增长,也能很好地收缩到大于或等于初始大小,但在它变小时,它的行为就像所有控件都对齐到左上角,并且控件(OK、Cancel和网格的一部分)移出了屏幕。最简单的解决方案是从最小的可能大小开始,并在OnLoad时将其设置为我们想要的大小。
就这样!我们解决了列编辑器!嗯,几乎。这解决了从属性浏览器访问的列编辑器。它并没有解决点击其右上角的按钮并从任务窗格中选择编辑列的问题。这就是ExtendedDataGridViewDesigner
的作用。我不会详细介绍,因为它主要是复制System.Design
中的DataGridViewDesigner
代码。不幸的是,我不得不复制而不是仅仅继承或使用反射来完成大部分工作。但有一个优点是,如果以后我想在任务窗格中添加我自己的东西,我就可以做到。
所以,我们有了!一个完全集成且改进的列编辑器,它不那么令人讨厌,并且应该能为您节省一些时间(即使只是节省了关于列编辑器大小令人讨厌的抱怨时间)。
其他特性
您有多少次试图弄清楚列的大小应该是什么?设计器只允许您输入一个数字,看看它看起来是否不错,进行修复,检查一下,然后重复,直到您满意为止。在我的控件上,如果您在打开标题上下文菜单时按住Shift键,它会在每个列旁边显示宽度。这样,您就可以直观地更改列的宽度,然后找出它的宽度。
最后是枚举,我的项目包括一个DataGridViewColumn
,用于为枚举提供良好的描述。您所要做的就是,当您声明一个枚举时,按照以下方式声明...
public enum Example
{
[Description("Enum Example 1")
EnumEx1,
[Description("Enum Example 2")
EnumEx2,
}
历史
- 版本 1 - 初始项目。
- 版本 1.0.1 - 修复了一个阻止某些键盘快捷键在标题菜单尚未显示时工作的bug。
- 版本 1.0.2 - 项目现在是为Visual Studio 2008准备的(抱歉,VS2005的用户,但我不再安装它了)。列编辑器现在有一个最大化按钮,并会记住其位置和大小。
最终想法
我想感谢所有阅读本文的人,特别是那些留下反馈的人。我很高兴这么多人觉得它很有用。
我注意到有些人给了差评。我不在乎,但如果您给了差评,请留下反馈解释原因。给差评并不能改进一篇文章。但留下解释原因的反馈可以。