65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.86/5 (4投票s)

2006年10月19日

CPOL

3分钟阅读

viewsIcon

41450

downloadIcon

996

一个自定义数据网格,它将数组对象作为其数据源,并且可以对其进行排序和筛选。

Sample Image - Figure1.jpg

引言

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上的第一篇文章。我希望你觉得它有用,请让我知道您的意见和评论。

请告诉我这个网格还应该有哪些其他功能。

另请参阅

© . All rights reserved.