EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:使用ActionAttribute在业务类定义中创建按钮

此示例演示如何在持久类声明中创建Action(即,如何将持久类方法转换为SimpleActionPopupWindowShowAction)。

提示

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

注意

创建一个简单的动作

让我们从下面的Task业务类开始。

[DefaultClassOptions, ImageName("BO_Task"), DefaultProperty(nameof(Subject))]
public class Task : BaseObject {
    public Task(Session session) : base(session) { }
    private string subject;
    public string Subject {
        get { return subject; }
        set { SetPropertyValue(nameof(Subject), ref subject, value); }
    }
    private bool isCompleted;
    public bool IsCompleted {
        get { return isCompleted; }
        set { SetPropertyValue(nameof(IsCompleted), ref isCompleted, value); }
    }
}

假定需要实现将IsCompleted值更改为true的Action 。将以下Complete方法添加到Task类,并使用ActionAttribute属性对其进行装饰。

[Action(Caption="Complete", TargetObjectsCriteria = "Not [IsCompleted]")]
public void Complete() {
    IsCompleted = true;
}

此类方法由ObjectMethodActionsViewController控制器从业务类中自动收集。该控制器将创建Task.Complete Action,它将为每个选定的Task调用Complete方法。请注意ActionAttribute.TargetObjectsCriteria参数的使用。对于已完成的任务,该操作将被禁用(IsCompleted属性为true)。您可以传递其他参数来自定义Action的外观和行为。下图说明了UI中的完成操作。

ActionAttributeExample_CompleteAction

创建一个显示弹出对话框的动作

接下来,使用几个其他属性扩展在本主题的上一节中演示的Task类,以演示更复杂的场景。这些是这些属性(“截止日期”和“注释”)。

using DevExpress.ExpressApp.Model;
// ...
private DateTime? deadline;
public DateTime? Deadline {
    get { return deadline; }
    set { SetPropertyValue(nameof(Deadline), ref deadline, value); }
}
private string comments;
[Size(SizeAttribute.Unlimited), ModelDefault("AllowEdit", "False")]
public string Comments {
    get { return comments; }
    set { SetPropertyValue(nameof(Comments), ref comments, value); }
}

假设您需要执行将“截止日期”推迟指定天数并更新“注释”文本的操作。首先,实现以下非持久类,该类声明最终用户推迟Task时要指定的参数。

using DevExpress.ExpressApp.DC;
// ...
[DomainComponent]
public class PostponeParametersObject {
    public PostponeParametersObject() { PostponeForDays = 1; }
    public uint PostponeForDays { get; set; }
    [Size(SizeAttribute.Unlimited)]
    public string Comment { get; set; }
}

然后,将以下Postpone方法添加到Task类。此方法采用PostponeParametersObject类型的参数,并用Action属性修饰。

[Action(Caption = "Postpone",
    TargetObjectsCriteria = "[Deadline] Is Not Null And Not [IsCompleted]")]
public void Postpone(PostponeParametersObject parameters) {
    if (Deadline.HasValue && !IsCompleted && (parameters.PostponeForDays > 0)) {
        Deadline  = TimeSpan.FromDays(parameters.PostponeForDays);
        Comments  = String.Format("Postponed for {0} days, new deadline is {1:d}\r\n{2}\r\n",
        parameters.PostponeForDays, Deadline, parameters.Comment);
    }
}

结果,将自动创建Task View随附的Task.Postpone Action 。最终用户指定参数并单击“确定”后,此操作将调用带有PostponeParametersObject详细信息视图的对话框并执行Postpone方法。下图说明了这一点。

ActioAttributeExample_PostponeActionWin

ActioAttributeExample_PostponeActionWeb

提示

如果需要对在弹出对话框中显示的参数进行重新排序,请在“模型编辑器”中修改参数对象的“详细视图”的布局。在上面的示例中,适当的“详细信息视图”节点是PostponeParametersObject_DetailView。请参阅“查看项目布局自定义”主题以了解有关布局自定义的更多信息。

访问当前对象实例

如果声明一个PostponeParametersObject构造函数,该构造函数采用目标业务对象类型(Task)的参数,则执行Action时,当前Task实例将传递给此构造函数。

[DomainComponent]
public class PostponeParametersObject {
    private Task task;
    public PostponeParametersObject(Task task) {
        PostponeForDays = 1;
        this.task = task;
    }
    // ...
}

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