EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:使用自动过滤器行过滤大型列表视图

本主题演示如何避免在Windows Forms应用程序中显示带有大量对象的List View的整个集合。一种方法是使用Windows窗体应用程序中使用的XtraGrid的“自动筛选行”。

ActiveFilterRow

要在XAF应用程序中激活“自动过滤器行”,请使用“应用程序模型”的“视图” | “ IModelListViewShowAutoFilterRow.ShowAutoFilterRow”属性。<ListView>节点。当此属性设置为true时,“自动筛选器行”可用。

默认情况下,当当前过滤器为空时,将检索所有现有对象。要禁止检索对象,请实现一个新的View Controller,如下所示。

假设您的应用程序使用Business Class Library中的Task业务类。想象一下Task对象集合非常大,因此,当您单击导航控件中的Task项时,将需要显示一个空的List View。但是,要获取所需的对象,可通过模型编辑器使用“自动过滤器行”。

  • 创建一个新的视图控制器。(在本示例中,它称为AutoFilterRowController。)要学习如何实现Controller,请参阅教程的Extend Functionality部分。
  • 设置控制器的范围,使其仅针对根任务列表视图被激活。为此,将ViewController.TargetViewType属性设置为ListView,将ViewController.TargetViewNesting设置Root,将ViewController.TargetObjectType设置DevExpress.Persistent.BaseImpl.Task
  • 若要在显示“任务列表视图”并且尚未应用网格的筛选器时禁止检索任务对象,请为视图的“集合源”设置错误的条件。为此,通过处理Controller的Controller.Activated事件来订阅View的View.ControlsCreated事件,以访问View的Grid控件。

    public partial class AutoFilterRowController : ViewController { 
       //...
       private ListView view;
    
       private void AutoFilterRowController_Activated(object sender, EventArgs e) {
          view = (ListView)View;
          view.ControlsCreated  = AutoFilterRowController_ControlsCreated;
       }
    }
    
  • ControlsCreated事件处理程序中,如果View的GridView的活动过滤器为空,则访问View的Grid控件并设置错误的条件:

    using DevExpress.XtraGrid.Views.Base;
    using DevExpress.Data.Filtering;
    using DevExpress.XtraGrid;
    //...
    public partial class AutoFilterRowController : ViewController {
       //...
       private ColumnView gridView;
       private CriteriaOperator falseCriteria = CriteriaOperator.Parse("1=0");
    
       void AutoFilterRowController_ControlsCreated(object sender, EventArgs e) {
          GridControl grid = view.Control as GridControl;
          gridView = grid.FocusedView as ColumnView;
          if(gridView.ActiveFilter.IsEmpty) {
             view.CollectionSource.Criteria["FalseCriteria"] = falseCriteria;
          }
          gridView.ActiveFilter.Changed  = ActiveFilter_Changed;
       }
    }
    
  • 如您在上面的代码中看到的,我们订阅了活动过滤器的Changed事件。当您需要通过自动过滤器行获取满足最终用户生成的过滤器的任务时,为了检索所有任务对象,这是必需的。此外,当最终用户取消活动过滤器时,请应用错误的条件。在这种情况下,事件处理程序为:

    public partial class AutoFilterRowController : ViewController {
       //...
       void ActiveFilter_Changed(object sender, EventArgs e) {
          if(((ViewFilter)sender).IsEmpty) {
            view.CollectionSource.Criteria["FalseCriteria"] = falseCriteria;
          }
          else {
             if(view.CollectionSource.Criteria.ContainsKey("FalseCriteria")) {
                view.CollectionSource.Criteria.Remove("FalseCriteria");
             }
          }
       }
    }
    
  • 运行该应用程序,并确保一切都按要求工作。
相关文章

转载保留此链接,注明出处