EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:在必需属性内进行FullTextSearch操作搜索

本主题演示如何自定义FullTextSearch Action的行为。此操作通过设置其收集数据源的条件来过滤当前列表视图。根据标准,对象的属性必须包含最终用户键入的单词组合中的单个单词。在FilterController.FullTextFilterAction成员说明中,参考有关如何修改Action行为的几种技术。在这里,您将看到如何使用这些技术之一。我们将指定属性的自定义列表,这些属性将用于为当前列表视图生成过滤条件。

提示

DevExpress代码示例数据库(http://www.devexpress.com/example=E231)中提供了完整的示例项目。

为了指定将在搜索中使用的属性的自定义列表,包含FullTextSearch Action的Filter Controller公开FilterController.CustomGetFullTextSearchProperties事件。为了处理此事件,我们将添加一个新的View Controller,并订阅其Controller.Activated事件。

CustomGetFullTextSearchProperties事件处理程序中,将所有必需属性的列表分配给CustomGetFullTextSearchPropertiesEventArgs.Properties参数。此外,将CustomGetFullTextSearchPropertiesEventArgs.Handled参数设置为true,以指示不得将其他属性添加到列表中。在此示例中,我们将仅添加Person类的“ LastName”属性。因此,我们将仅激活“人员列表视图”控制器。所述MyFilterController如下所示:

using System;
using System.Collections.Generic;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.SystemModule;
//...
public partial class MyFilterController : ViewController {
    public MyFilterController() {
        InitializeComponent();
        RegisterActions(components);
        this.TargetObjectType = typeof(DevExpress.Persistent.BaseImpl.Person);
    }
    private void MyFilterController_Activated(object sender, EventArgs e) {
        FilterController standardFilterController = Frame.GetController<FilterController>();
        if(standardFilterController != null) {
            standardFilterController.CustomGetFullTextSearchProperties  = new 
EventHandler<CustomGetFullTextSearchPropertiesEventArgs>(standardFilterController_CustomGetFullTextSearchProperties);
        }
    }
    void standardFilterController_CustomGetFullTextSearchProperties(object sender, 
CustomGetFullTextSearchPropertiesEventArgs e) {
        foreach(string property in GetFullTextSearchProperties()) {
            e.Properties.Add(property);
        }
        e.Handled = true;
    }
    private List<string> GetFullTextSearchProperties() {
        List<string> searchProperties = new List<string>();
        searchProperties.Add("LastName");
        return searchProperties;
    }
}

下图演示了MyFilterController的工作原理:

FilterByTextAction_CustomGetFullTextSearchProperties

如果一个或多个属性为特定类型,则可能无法进行过滤。例如,在服务器模式下,按DateTime类型的属性进行过滤可能会导致异常,这些属性作为datetime date类型的列存储在数据库中。为避免它们,请确保可以将输入的文本转换为相应的类型,并且此转换后的值在可接受的范围内,并在必要时从默认过滤器列表中排除属性。以下代码演示了控制器实现此逻辑的方法。

using System;
using System.Collections.Generic;
using DevExpress.ExpressApp;
using DevExpress.ExpressApp.SystemModule;
using DevExpress.ExpressApp.DC;
using DevExpress.Data.Summary;
using System.Data.SqlTypes;
//...
public class MyFilterController : ViewController<ListView> {
    private static readonly DateTime minDate;
    private static readonly DateTime maxDate;
    static MyFilterController() {
        minDate = (DateTime)SqlDateTime.MinValue;
        maxDate = (DateTime)SqlDateTime.MaxValue;
    }
    private Boolean CanFilter(string propertyName, string filterText) {
        IMemberInfo memberInfo = View.ObjectTypeInfo.FindMember(propertyName);
        if (SummaryItemTypeHelper.IsDateTime(memberInfo.MemberType)) {
            DateTime? convertedFilter = null;
            try {
                convertedFilter = Convert.ChangeType(filterText, typeof(DateTime)) as DateTime?;
            }
            catch {
                return false;
            }
            if (convertedFilter.HasValue) {
                if ((convertedFilter.Value < minDate) || (convertedFilter.Value > maxDate)) {
                    return false;
                }
            }
        }
        return true;
    }
    private ICollection<string> GetProcessedRequiredProperties(ICollection<string> searchProperties, 
string filterText) {
        List<string> result = new List<string>();
        foreach (string propertyName in searchProperties) {
           if (CanFilter(propertyName, filterText)) {
               result.Add(propertyName);
            }
        }
        return result;
    }
    private void FilterController_CustomGetFullTextSearchProperties(object sender, 
CustomGetFullTextSearchPropertiesEventArgs e) {
        string filterText = ((FilterController)sender).FullTextFilterAction.Value as string;
        if (!string.IsNullOrEmpty(filterText)) {
            ICollection<string> searchProperties = 
GetProcessedRequiredProperties(((FilterController)sender).GetFullTextSearchProperties(), filterText);
            e.Properties.AddRange(searchProperties);
            e.Handled = true;
        }
    }
    protected override void OnActivated() {
        base.OnActivated();
        FilterController filterController = Frame.GetController<FilterController>();
        if (filterController != null) {
            filterController.CustomGetFullTextSearchProperties  = 
FilterController_CustomGetFullTextSearchProperties;
        }
    }
    protected override void OnDeactivated() {
        FilterController filterController = Frame.GetController<FilterController>();
        if (filterController != null) {
            filterController.CustomGetFullTextSearchProperties -= 
FilterController_CustomGetFullTextSearchProperties;
        }
        base.OnDeactivated();
    }
}
相关文章

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