DevExpress XAF 查找列表视图及联级过滤
主要通过列表视图,实现联级过滤。只是对官方文件做了简单的代码复制,以后有机会再整理和修改。
初始化实现
使用the DataSourcePropertyAttribute 和 DataSourceCriteriaAttribute实现联级过滤。
1 using System.ComponentModel; 2 using DevExpress.Data.Filtering; 3 //... 4 [DefaultClassOptions] 5 public class Order : BaseObject { 6 public Order(Session session) : base(session) { } 7 private Product product; 8 public Product Product { 9 get { 10 return product; 11 } 12 set { 13 SetPropertyValue("Product", ref product, value); 14 } 15 } 16 private Accessory accessory; 17 public Accessory Accessory { 18 get { 19 return accessory; 20 } 21 set { 22 SetPropertyValue("Accessory", ref accessory, value); 23 } 24 } 25 } 26 public class Product : BaseObject { 27 public Product(Session session) : base(session) { } 28 private String productName; 29 public String ProductName { 30 get { 31 return productName; 32 } 33 set { 34 SetPropertyValue("ProductName", ref productName, value); 35 } 36 } 37 [Association("P-To-C")] 38 public XPCollection<Accessory> Accessories { 39 get { return GetCollection<Accessory>("Accessories"); } 40 } 41 } 42 public class Accessory : BaseObject { 43 public Accessory(Session session) : base(session) { } 44 private String accessoryName; 45 public String AccessoryName { 46 get { 47 return accessoryName; 48 } 49 set { 50 SetPropertyValue("AccessoryName", ref accessoryName, value); 51 } 52 } 53 private bool isGlobal; 54 public bool IsGlobal { 55 get { 56 return isGlobal; 57 } 58 set { 59 SetPropertyValue("IsGlobal", ref isGlobal, value); 60 } 61 } 62 private Product product; 63 [Association("P-To-C")] 64 public Product Product { 65 get { 66 return product; 67 } 68 set { 69 SetPropertyValue("Product", ref product, value); 70 } 71 } 72 }
效果下图。
场景1 -使用指定集合属性中的对象填充查找
关键代码:[DataSourceProperty("Product.Accessories")]
1 [DefaultClassOptions] 2 public class Order : BaseObject { 3 // ... 4 [DataSourceProperty("Product.Accessories")] 5 public Accessory Accessory { 6 get { 7 return accessory; 8 } 9 set { 10 SetPropertyValue("Accessory", ref accessory, value); 11 } 12 } 13 }
效果如下图:
场景2 -为Lookup属性集合应用标准
1 [DefaultClassOptions] 2 public class Order : BaseObject { 3 // ... 4 [DataSourceCriteria("IsGlobal = true")] 5 public Accessory Accessory { 6 get { 7 return accessory; 8 } 9 set { 10 SetPropertyValue("Accessory", ref accessory, value); 11 } 12 } 13 } 14 public class Accessory : BaseObject { 15 // ... 16 private bool isGlobal; 17 public bool IsGlobal { 18 get { return isGlobal; } 19 set { 20 SetPropertyValue("IsGlobal", ref isGlobal, value); 21 } 22 } 23 }
场景3 -如果指定的数据源属性为空,则使用备用标准
1 [DefaultClassOptions] 2 public class Order : BaseObject { 3 // ... 4 [DataSourceProperty("Product.Accessories", 5 DataSourcePropertyIsNullMode.CustomCriteria, "IsGlobal = true")] 6 public Accessory Accessory { 7 get { 8 return accessory; 9 } 10 set { 11 SetPropertyValue("Accessory", ref accessory, value); 12 } 13 } 14 }
场景4 -手动填充查找
[DefaultClassOptions] public class Order : BaseObject { // ... // Set the AvailableAccessories collection as a data source for the Accessory property [DataSourceProperty("AvailableAccessories")] public Accessory Accessory { get {return accessory;} set { SetPropertyValue("Accessory", ref accessory, value); } } private XPCollection<Accessory> availableAccessories; [Browsable(false)] // Prohibits showing the AvailableAccessories collection separately public XPCollection<Accessory> AvailableAccessories { get { if(availableAccessories == null) { // Retrieve all Accessory objects availableAccessories = new XPCollection<Accessory>(Session); // Filter the retrieved collection according to current conditions RefreshAvailableAccessories(); } // Return the filtered collection of Accessory objects return availableAccessories; } } private void RefreshAvailableAccessories() { if(availableAccessories == null) return; // Process the situation when the Product is not specified (see the Scenario 3 above) if(Product == null) { // Show only Global Accessories when the Product is not specified availableAccessories.Criteria = CriteriaOperator.Parse("[IsGlobal] = true"); } else { // Leave only the current Product's Accessories in the availableAccessories collection availableAccessories.Criteria = new BinaryOperator("Product", Product); if(IncludeGlobalAccessories == true) { // Add Global Accessories XPCollection<Accessory> availableGlobalAccessories = new XPCollection<Accessory>(Session); availableGlobalAccessories.Criteria = CriteriaOperator.Parse("[IsGlobal] = true"); availableAccessories.AddRange(availableGlobalAccessories); } } // Set null for the Accessory property to allow an end-user //to set a new value from the refreshed data source Accessory = null; } public Product Product { get {return product;} set { SetPropertyValue("Product", ref product, value); // Refresh the Accessory Property data source RefreshAvailableAccessories(); } } private bool includeGlobalAccessories; [ImmediatePostData] //Use this attribute to refresh the Accessory public bool IncludeGlobalAccessories { get {return includeGlobalAccessories;} set { if(includeGlobalAccessories != value) { includeGlobalAccessories = value; if(!IsLoading) { // Refresh the Accessory Property data source RefreshAvailableAccessories(); SetPropertyValue("IncludeGlobalAccessories", ref includeGlobalAccessories, value); } } } } }
场景5 -根据当前对象的属性筛选Lookup属性集合
1 using DevExpress.Persistent.Base; 2 using DevExpress.Persistent.BaseImpl; 3 // ... 4 public class Contact : Person { 5 // ... 6 [DataSourceProperty("Department.Contacts", DataSourcePropertyIsNullMode.SelectAll)] 7 [DataSourceCriteria("Position.Title = 'Manager' AND Oid != '@This.Oid'")] 8 public Contact Manager { 9 get { 10 return manager; 11 } 12 set { 13 SetPropertyValue("Manager", ref manager, value); 14 } 15 } 16 // ... 17 }
参考网址
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。