对于CompoentOne FlexGrid for WinForms来说,默认通过AllowFiltering属性,就可以使用内置的过滤功能。一旦过滤打开,每一列都可以编辑过滤,只要点击列头上的过滤图标,过滤的下拉框就会打开展示出来。

通过下拉框,可以过滤数据的值。

本文就来介绍如何自定义过滤下拉框满足更多的需求。

 

实现步骤

基本的,获取过滤下拉框作为单独的窗体,然后再ToolScrip上添加按钮执行期望的操作(例如,排序)。

方法包含如下步骤:

第一步

第一步是检查列头的过滤图标是否被点击。

为了达到这个目的,需要在MouseClick事件里使用HitTest方法。

   1:  private void C1FlexGrid1_MouseClick(object sender, MouseEventArgs e)
   2:  {
   3:  if (C1FlexGrid1.HitTest(e.Location).Type == C1.Win.C1FlexGrid.HitTestTypeEnum.FilterIcon)
   4:  {
   5:  CustomFilterMenu();
   6:  HitTestInfo hti = C1FlexGrid1.HitTest(e.X, e.Y);
   7:  col = hti.Column;
   8:  }
   9:  }

 

'CustomFilterMenu' 方法中包含完成的自定义过滤下拉框代码。

第二步:

当检查过过滤图标是否被点击,就该自定义下拉框,这是通过在菜单的ToolScrip里添加按钮实现。

过滤下拉菜单是C1FlexGrid的对象,可以直接获取。

因此过滤下拉菜单可以作为窗体继承实现功能。

使用”OpenForms”类检查打开的窗体。

在OpenForms集合中,每次检查名字和类型是否是”FilterEditorForm”和“C1.Win.C1FlexGrid.FilterEditorForm”

   1:  private void CustomFilterMenu()
   2:  {
   3:  foreach (Form frm in Application.OpenForms)
   4:  {
   5:  if (frm.Name == "FilterEditorForm" & frm.GetType().ToString() == "C1.Win.C1FlexGrid.FilterEditorForm")
   6:  {
   7:  //Perform the desired functionality
   8:  }
   9:  }
  10:  }

第三步

在获取到FilterEditorForm后,可以通过需求改变它。

作为我们继承实现了排序,我们需要在窗体的Tools次日拍添加两个按钮,排序就可以在表格实现。

   1:  if (frm.Name == "FilterEditorForm" & frm.GetType().ToString() == "C1.Win.C1FlexGrid.FilterEditorForm")
   2:  {
   3:  filterForm = frm;
   4:  filterForm.Width = filterForm.Width + 70;
   5:  frm.Refresh();
   6:   
   7:  foreach (object item in filterForm.Controls)
   8:  {
   9:  dynamic ts = item as ToolStrip;
  10:  if (ts != null)
  11:  {
  12:  ToolStripButton tsASC = new ToolStripButton();
  13:  ToolStripButton tsDESC = new ToolStripButton();
  14:   
  15:  tsASC.Text = "Sort Asc";
  16:  tsDESC.Text = "Sort Desc";
  17:   
  18:  tsASC.Image = global::C1FlexGrid_CustomFilterMenu_CS.Properties.Resources.Upimage;
  19:  tsDESC.Image = global::C1FlexGrid_CustomFilterMenu_CS.Properties.Resources.Downimage;
  20:   
  21:  tsASC.ImageScaling = ToolStripItemImageScaling.None;
  22:  tsASC.ImageTransparentColor = Color.White;
  23:   
  24:  tsDESC.ImageScaling = ToolStripItemImageScaling.None;
  25:  tsDESC.ImageTransparentColor = Color.White;
  26:   
  27:  tsASC.Click += tsASC_Click;
  28:  tsDESC.Click += tsDESC_Click;
  29:   
  30:  ts.Items.Add(tsASC);
  31:  ts.Items.Add(tsDESC);
  32:  }
  33:   
  34:  }
  35:   
  36:  frm.Refresh();
  37:  }
  38:  }
  39:  }
  40:   
  41:  private void tsASC_Click(object sender, EventArgs e)
  42:  {
  43:  C1FlexGrid1.Sort(SortFlags.Ascending, col);
  44:  filterForm.Close();
  45:  }
  46:   
  47:  private void tsDESC_Click(object sender, EventArgs e)
  48:  {
  49:  C1FlexGrid1.Sort(SortFlags.Descending, col);
  50:  filterForm.Close();
  51:  }

 

到此,就完成了需求的功能。

示例下载:

 

更多资源

C1FlexGrid for Winform中文帮助文档地址:

/docs/componentonestudio/flexgrid/

如果你对C1FlexGrid感兴趣,请到我们的官网下载最新版本:/download/?pid=3

如果你有疑问,可以到GCDN论坛获得技术支持:http://gcdn.grapecity.com.cn/showforum-68.html