具有排序和过滤功能的数组数据网格






3.86/5 (4投票s)
一个自定义数据网格,它将数组对象作为其数据源,并且可以对其进行排序和筛选。
引言
System.Windows.Forms.DataGrid
是一个具有许多功能的强大控件,但我认为使用起来有点困难。所以我编写了一个使用数据网格的用户控件,但它更容易使用。以下是它的功能
- 它获取一个对象数组作为其数据源
- 它将其选定的项目作为一个对象返回
- 它将其选定的项目作为一个对象数组返回
- 您可以非常轻松地格式化它
- 您可以向其数据源添加一个对象
- 您可以从其数据源中删除一个对象
- 您可以筛选其数据源
- 您可以排序其数据源
工作原理
设置数据源
您可以像这样设置它的数据源
myGrid.DataSource=users; //users is an array of type User.
格式化
您可以使用GridFormatter
对象来格式化网格。
网格格式化程序是一个包含一些列格式化程序的对象,这些列格式化程序会告诉网格如何格式化自身。每个列格式化程序都包含一个DataGridColumnStyle
类型。
GridFormatter format1=new GridFormatter() ;
format1.AddColumnFormatter("FirstName","FirstName",
typeof(DataGridTextBoxColumn));
如果您想隐藏一列,只需不要向您的网格格式化程序添加列格式化程序。
当网格格式化程序准备好时,我们设置我们的数据网格格式化程序以让它格式化自身。
myGrid.GridFormatter=format1;
好消息是您可以随时更改您的格式化程序。
GridFormatter
使用DataGridColumnStyle
对象来格式化网格,您可以轻松地在您的网格中显示几乎所有内容。(这里是Declan Brennan关于DataGridColumnStyle
的文章,我发现非常有趣)。添加和删除记录
有时您想在运行时添加或删除记录。
您可以使用AddRow(object obj)
和AddRows(object[] objects)
方法来完成它。
myGrid.AddRow(new User("FName","LName"));
如果您想删除一些记录,请使用Remove(object obj)
或Remove(object[] objects)
。
获取选定的项目
您可以使用SelectedItem
属性获取当前行(作为对象)。
User selectedUser=(User)myGrid.SelectedItem;
您可以使用SelectedItems
属性获取选定的项目(作为object
数组)。
usersGrid.AddRows((User[])myGrid.SelectedItems);
筛选和排序
您可以使用ApplyFilter(ExpressionBuilder expression)
将过滤器应用于您的网格。应用过滤器需要一个表达式生成器来构建其过滤器表达式。表达式生成器是一个构建字符串的对象。例如,如果您想说“FirstName='Fname' And Age>'15'”,您将编写
ExpressionBuilder expBuilder =
new AndExpression(new EqExpression("FirstName","FName"),
new GtExpression("Age",15));
它与Hibernate/NHibernate表达式对象模型非常相似。
有不同的表达式生成器使用组合模式一起工作,因此您可以组合它们以生成一个复杂的表达式。
现在我们有一个表达式生成器,我们可以用来过滤我们的网格。
myGrid.ApplyFilter(expBuilder);
要删除过滤器,只需使用RemoveFilter()
方法。
如果您想排序一个DataGrid
,您可以使用一个Order
对象数组(同样,它与Hibernate/NHibernate非常相似)。
一个排序对象接受一个列名和一个布尔值,指示是升序排序(true
)还是降序排序(false
)。
Order[] order=new Order[]{new Order("FirstName",true),
new Order("LastName",false)};
myGrid.Sort(order);
结语
这是我在CodeProject上的第一篇文章。我希望你觉得它有用,请让我知道您的意见和评论。
请告诉我这个网格还应该有哪些其他功能。