EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

使属性可计算

在本课程中,您将学习如何管理计算的属性。为此,将实现Payment类。其“金额”属性值将使用“费率”和“小时数”属性进行计算。更改Rate属性后,该值将立即更新。

注意

在继续之前,请花一点时间回顾以下课程。

  • 要实现Payment类,请右键单击MySolution.Module项目中的Business Objects文件夹,然后选择Add DevExpress Item | Add。新项...。在调用的模板库中,选择XAF业务对象|。如果使用XPO和XAF业务对象,则XPO业务对象模板| EF业务对象模板(如果您的ORM是EF),输入“付款”作为文件名,然后单击添加。用以下代码替换自动生成的类声明。

    eXpress持久对象

    [DefaultClassOptions, ImageName("BO_SaleItem")]
    public class Payment : BaseObject {
        public Payment(Session session) : base(session) { }
        private double rate;
        public double Rate {
            get {
                return rate;
            }
            set {
                if(SetPropertyValue(nameof(Rate), ref rate, value))
                    OnChanged(nameof(Amount));
            }
        }
        private double hours;
        public double Hours {
            get {
                return hours;
            }
            set {
                if(SetPropertyValue(nameof(Hours), ref hours, value))
                    OnChanged(nameof(Amount));
            }
        }
        [PersistentAlias("Rate * Hours")]
        public double Amount {
            get {
                object tempObject = EvaluateAlias(nameof(Amount));
                if(tempObject != null) {
                    return (double)tempObject;
                }
                else {
                    return 0;
                }
            }
        }
    }
    

    实体框架

    using System;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations.Schema;
    using DevExpress.Persistent.Base;
    
    namespace MySolution.Module.BusinessObjects {
        [DefaultClassOptions, ImageName("BO_SaleItem")]
        public class Payment {
            [Browsable(false)]
            public Int32 ID { get; protected set; }
            public double Rate { get; set; }
            public double Hours { get; set; }
    
            [NotMapped]
            public double Amount {
                get { return Rate * Hours; }
            }
        }
    }
    
    注意

    请注意,如果使用实体框架,则必须在DbContext中注册新类。有关详细信息,请参见从业务类库类(EF)继承

    由于没有设置访问器,因此将计算Amount属性,并且在get访问器中实现其值计算的逻辑。

    注意

    在上面的代码中,PersistentAliasAttribute装饰了Amount非持久计算属性,以允许在数据库级别执行此属性的过滤和排序。所述PersistentAlias属性采用指定用于计算在数据库服务器侧的属性值的表达式的参数。必须在代码中将持久别名指定为属性的参数。但是,在某些情况下,该属性可能需要可配置的持久别名,并且它必须可由管理员在已部署的应用程序中进行配置。在这种情况下,应使用CalculatedPersistentAliasAttribute。

  • 重建MySolution.Module项目并为其调用模型编辑器。导航到BOModel | 付款| 会员| 评价节点。将RateInstantPostData属性设置为True。该ImmediatePostData属性指定是否将属性值更改后立即更新出现在当前属性编辑器的绑定控件。由于计算的Amount属性值取决于Rate,因此这些值将在UI中同时更新。

    Tutorial_UIC_Lesson6_1

    注意

    或者,您可以在代码中使用InstantPostDataAttribute

  • 运行WinForms应用程序。在导航控件中选择“付款”项。单击新建按钮。新的Payment对象的详细信息表格将被调用。指定“费率”和“小时数”属性,然后保存更改。然后,更改“费率”和“小时数”属性,并查看其如何影响“金额”属性。更改“费率”属性值时以及“小时”属性字段失去焦点之后,“金额”属性值都会立即更新。

    Tutorial_UIC_Lesson6_2

  • 运行ASP.NET应用程序。在导航控件中选择“付款”项。在编辑模式下调用付款明细视图。然后,更改“费率”和“小时数”属性以查看其如何影响“金额”属性。在“速率”属性字段失去焦点之后,将立即更新页面。如果更改“小时”属性值,则在保存更改后将更新“金额”值。

    Tutorial_UIC_Lesson6_3

您可以在“主要演示”中查看本课程中所做的更改。MainDemo.Module项目。该MainDemo应用程序安装在%PUBLIC%\文件\ DevExpress的演示19.2 \组件\ eXpressApp框架\ MainDemo默认。可从http://demos.devexpress.com/XAF/MainDemo/在线获得ASP.NET版本。请注意,在MainDemoImmediatePostData财产营业时间也被设置为“”,这样的行为是在本教程中所描述的行为不同。

下一课: 筛选器查找编辑器数据源

相关文章

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