商信互联
“过滤器 应用程序模型”节点允许您将预定义条件添加到内置SetFilter Action中。在“操作”的下拉窗口中选择条件时,将使用此条件过滤当前列表视图。
当您需要最终用户能够选择所需的过滤器时,请使用此技术过滤列表视图。此外,有权访问应用程序模型的最终用户将能够通过模型编辑器添加或更改预定义的过滤器。
对于在“过滤器”节点中未指定过滤器的列表视图,不会激活SetFilter操作。另外,可以为根列表视图和嵌套列表视图激活此操作,因为MainForm和DetailViewForm Windows窗体模板以及默认ASP.NET模板包含显示此操作的“筛选器操作”容器。若要了解如何在弹出窗口中显示“筛选器操作”,请参阅“将操作添加到弹出窗口”主题。
要自定义SetFilter Action的行为,请通过代码对其进行访问。此Action包含在FilterController中,可以通过其FilterController.SetFilterAction属性进行访问。
要将项目添加到SetFilter Action中,请执行以下操作。
对于新的“过滤器”节点,指定ID,Caption和Criteria属性。必须使用“标准语言语法”指定“标准”值。为了简化此任务,您可以通过单击“条件”值右侧的省略号按钮()来调用“过滤器生成器”对话框。在此对话框中,您可以直观地设计条件表达式。
您可以通过ListViewFilterAttribute在代码中添加预定义的过滤器。通过此属性指定的筛选器将添加到ListView节点的“筛选器”节点,该节点的IModelObjectView.ModelClass属性设置为应用该属性的类。
using DevExpress.ExpressApp.Model;
using DevExpress.ExpressApp.SystemModule;
//...
[DefaultClassOptions]
[ListViewFilter("Today", "[DueDate] = LocalDateTimeToday()")]
[ListViewFilter("In three days", "[DueDate] >= ADDDAYS(LocalDateTimeToday(), -3) AND
[DueDate] < LocalDateTimeToday()")]
[ListViewFilter("In two weeks", "[DueDate] >= ADDDAYS(LocalDateTimeToday(), -14) AND
[DueDate] < LocalDateTimeToday()")]
[ListViewFilter("The last week", "[DueDate] > LocalDateTimeLastWeek() AND
[DueDate] <= ADDDAYS(LocalDateTimeLastWeek(), 5)")]
[ListViewFilter("This week", "[DueDate] > LocalDateTimeThisWeek() AND
[DueDate] <= ADDDAYS(LocalDateTimeThisWeek(), 5)")]
public class Task : BaseObject {
public Task(Session session) : base(session) {}
private DateTime dueDate;
[ModelDefault("EditMask","d")]
public DateTime DueDate {
get {
return dueDate;
}
set {
SetPropertyValue(nameof(DueDate), ref dueDate, value); }
}
}
Imports DevExpress.ExpressApp.Model
Imports DevExpress.ExpressApp.SystemModule
'...
<DefaultClassOptions, _
ListViewFilter("Today", "[DueDate] = LocalDateTimeToday()"), _
ListViewFilter("In three days", "[DueDate] >= ADDDAYS(LocalDateTimeToday(), -3) AND _
[DueDate] < LocalDateTimeToday()"), _
ListViewFilter("In two weeks", "[DueDate] >= ADDDAYS(LocalDateTimeToday(), -14) AND _
[DueDate] < LocalDateTimeToday()"), _
ListViewFilter("The last week", "[DueDate] > LocalDateTimeLastWeek() AND _
[DueDate] <= ADDDAYS(LocalDateTimeLastWeek(), 5)"), _
ListViewFilter("This week", "[DueDate] > LocalDateTimeThisWeek() AND _
[DueDate] <= ADDDAYS(LocalDateTimeThisWeek(), 5)")> _
Public Class Task
Inherits BaseObject
Public Sub New(ByVal session As Session)
MyBase.New(session)
End Sub
Private fDueDate As DateTime
<ModelDefault("EditMask","d")> _
Public Property DueDate() As DateTime
Get
Return fDueDate
End Get
Set(ByVal value As DateTime)
SetPropertyValue(NameOf(DueDate), fDueDate, value)
End Set
End Property
End Class
如果要添加很难以字符串形式编写的复杂过滤器,请通过为ModelListViewFiltersGenerator节点生成器实现ModelNodesGeneratorUpdater <T>后代(Generator Updater)来在代码中添加IModelListViewFilterItem应用程序模型节点:
using DevExpress.ExpressApp.Model;
using DevExpress.ExpressApp.Model.Core;
using DevExpress.ExpressApp.SystemModule;
//...
public sealed class Module : ModuleBase {
// ...
public override void AddGeneratorUpdaters(ModelNodesGeneratorUpdaters updaters) {
base.AddGeneratorUpdaters(updaters);
updaters.Add(new MyFilterUpdater());
}
}
public class MyFilterUpdater : ModelNodesGeneratorUpdater<ModelListViewFiltersGenerator> {
public override void UpdateNode(ModelNode node) {
IModelListViewFilters filtersNode = (IModelListViewFilters)node;
if(((IModelListView)filtersNode.Parent).ModelClass.TypeInfo.Type ==
typeof(MyBusinessClass)) {
IModelListViewFilterItem myFilter =
filtersNode.AddNode<IModelListViewFilterItem>("MyComplexFilter");
myFilter.Criteria = "";
myFilter.Index = 1;
myFilter.Caption = "My Filter";
myFilter.Description = "";
filtersNode.CurrentFilter = myFilter;
}
}
}
Imports DevExpress.ExpressApp.Model
Imports DevExpress.ExpressApp.Model.Core
Imports DevExpress.ExpressApp.SystemModule
'...
Public NotInheritable Class [Module]
Inherits ModuleBase
' ...
Public Overrides Sub AddGeneratorUpdaters(ByVal updaters As ModelNodesGeneratorUpdaters)
MyBase.AddGeneratorUpdaters(updaters)
updaters.Add(New MyFilterUpdater())
End Sub
End Class
Public Class MyFilterUpdater
Inherits ModelNodesGeneratorUpdater(Of ModelListViewFiltersGenerator)
Public Overrides Sub UpdateNode(ByVal node As ModelNode)
Dim filtersNode As IModelListViewFilters = CType(node, IModelListViewFilters)
If (CType(filtersNode.Parent, IModelListView)).ModelClass.TypeInfo.Type Is _
GetType(MyBusinessClass) Then
Dim myFilter As IModelListViewFilterItem = _
filtersNode.AddNode(Of IModelListViewFilterItem)("MyComplexFilter")
myFilter.Criteria = ""
myFilter.Index = 1
myFilter.Caption = "My Filter"
myFilter.Description = ""
filtersNode.CurrentFilter = myFilter
End If
End Sub
End Class
要了解有关如何在代码中扩展应用程序模型的整个概念,请参阅在代码中扩展和自定义应用程序模型主题。
要了解如何建立标准,请参阅“建立标准的方法”主题。