EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

通过选项选择添加操作

在本课程中,您将学习如何创建支持选项选择的动作。将实现一个新的View Controller,并将SingleChoiceAction添加到其中。通过此操作,Task.PriorityTask.Status属性将设置为最终用户选择的值。

注意

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

  • 如“添加简单操作”课程中所述,将新的View Controller添加到MySolution.Module项目中。将其命名为TaskActionsController。
  • 右键单击MySolution.Module | 控制器| TaskActionsController.csTaskActionsController.vb)文件,然后选择“视图设计器”以调用设计器。在DX内。19.2:“ XAF动作工具箱”选项卡,导航到SingleChoiceAction并将其拖到设计器中。在SingleChoiceAction的属性”窗口中,将“名称”和“ ID”属性设置为“ SetTaskAction”,将“标题”属性设置为““设置任务””,将“类别”属性设置为“编辑”。设置ItemType 属性设置为“ ItemIsOperation”。

    Tutorial_EF_Lesson5_2

    注意
    • 所述ActionBase.Category属性指定到当前操作所属的操作组。单个组中的所有操作将在UI中一起显示。
    • SingleChoiceAction.ItemType属性指定动作的选项的显示模式。在将“ ItemIsOperation”值设置为该属性的情况下,复选框的项目将不会显示操作的项目,就像设置“ ItemIsMode”值时的情况一样。
  • 要激活TaskActionsControllerDemoTask对象只,设置控制器ViewController.TargetObjectType属性MySolution.Module.BusinessObjects.DemoTask

    Tutorial_EF_Lesson5_2_1

  • 要用项目填充Action ,请在Controller的构造函数中填充Action的ChoiceActionBase.Items集合。

    using DevExpress.ExpressApp.Utils;
    using DevExpress.Persistent.Base.General;
    using MySolution.Module.BusinessObjects;
    //...
    public partial class TaskActionsController : ViewController {
       private ChoiceActionItem setPriorityItem;
       private ChoiceActionItem setStatusItem;
       public TaskActionsController() {
          InitializeComponent();
          SetTaskAction.Items.Clear();
          setPriorityItem = 
             new ChoiceActionItem(CaptionHelper.GetMemberCaption(typeof(DemoTask), "Priority"), null);
          SetTaskAction.Items.Add(setPriorityItem);
          FillItemWithEnumValues(setPriorityItem, typeof(Priority));
          setStatusItem = 
             new ChoiceActionItem(CaptionHelper.GetMemberCaption(typeof(DemoTask), "Status"), null);
          SetTaskAction.Items.Add(setStatusItem);
          FillItemWithEnumValues(setStatusItem, typeof(TaskStatus));
       }
       private void FillItemWithEnumValues(ChoiceActionItem parentItem, Type enumType) {
          foreach(object current in Enum.GetValues(enumType)) {
             EnumDescriptor ed = new EnumDescriptor(enumType);
             ChoiceActionItem item = new ChoiceActionItem(ed.GetCaption(current), current);
             item.ImageName = ImageLoader.Instance.GetEnumValueImageName(current);
             parentItem.Items.Add(item);
          }
       }
    }
    

    上面的代码将“操作”的“项目”集合中的项目组织为一棵树。第一层由标题与DemoTask.PriorityDemoTask.Status属性名称对应的项目组成。第二级由“优先级”和“状态”枚举值组成。第一级标题由CaptionHelper对象返回;第二级标题由CaptionHelper对象返回。而第二级标题则由EnumDescriptor对象返回。通过应用程序模型本地化“优先级”和“状态”属性以及相应的枚举值时,这很有用。

    注意

    如果您在控制器的构造函数中创建一个Action的Items,则将为每个Window创建一次。例如,如果经常更改窗口的“视图”(例如,如果这是主窗口并且未打开“多文档界面”(MDI)模式),则这可能是有利的。或者,您可以在重写的OnActivated方法中添加Items 。在这种情况下,在显示所需的视图之前将不会创建项目,但会在每次显示该视图时创建它们。

    下面的代码段设置与SetTask Action项目的PriorityTaskStatus枚举值关联的图像。请注意,TaskStatus枚举在业务类库中声明,并且已经为其值分配了图像。要将图像分配给您在DemoTask.cs(DemoTask.vb)文件中声明的Priority枚举值,请使用ImageNameAttribute属性对其进行修饰。

    public enum Priority {
        [ImageName("State_Priority_Low")]
        Low = 0,
        [ImageName("State_Priority_Normal")]
        Normal = 1,
        [ImageName("State_Priority_High")]
        High = 2
    }
    
    注意

    XAF随附的标准图像库中包含State_Priority_Low,State_Priority_NormalState_Priority_High图像。要了解如何使用自定义图像,请参阅分配自定义图像课程。

    如上面的代码所示,当在Controller的构造函数中填充ChoiceActionBase.Items集合时,可以使用模型编辑器ActionDesign | | | |为添加的项目设置图像名称,快捷方式和本地化标题。动作| <动作> | ChoiceActionItems节点。要学习如何调用和使用模型编辑器,请参阅UI Customization部分中的第一课。但是,您可能必须在Controller的Controller中填充Items集合。 事件处理程序,您可以在其中访问当前的应用程序,视图等。在这种情况下,添加到集合中的项目将不会加载到模型编辑器中。

  • 要实现最终用户选择Action项目时必须执行的代码,请处理SingleChoiceAction.Execute事件,如下所示。

    using DevExpress.ExpressApp.Editors;
    using System.Collections;
    using MySolution.Module.BusinessObjects;
    //...
    private void SetTaskAction_Execute(object sender, SingleChoiceActionExecuteEventArgs e) {
        IObjectSpace objectSpace = View is ListView ? 
            Application.CreateObjectSpace(typeof(DemoTask)) : View.ObjectSpace;
        ArrayList objectsToProcess = new ArrayList(e.SelectedObjects);
        if(e.SelectedChoiceActionItem.ParentItem == setPriorityItem) {
            foreach(Object obj in objectsToProcess) {
                DemoTask objInNewObjectSpace = (DemoTask)objectSpace.GetObject(obj);
                objInNewObjectSpace.Priority = (Priority)e.SelectedChoiceActionItem.Data;
            }
        }
        else
            if(e.SelectedChoiceActionItem.ParentItem == setStatusItem) {
                foreach(Object obj in objectsToProcess) {
                    DemoTask objInNewObjectSpace = (DemoTask)objectSpace.GetObject(obj);
                    objInNewObjectSpace.Status = (TaskStatus)e.SelectedChoiceActionItem.Data;
                }
            }
        if(View is DetailView && ((DetailView)View).ViewEditMode == ViewEditMode.View) {
            objectSpace.CommitChanges();
        }
        if(View is ListView) {
            objectSpace.CommitChanges();
            View.ObjectSpace.Refresh();
        }
    }
    

    如您在上面的代码中看到的那样,通过事件处理程序的SingleChoiceActionExecuteEventArgs.SelectedChoiceActionItem参数访问SetTaskAction下拉列表中当前选择的项目。要将选定的值分配给在当前View中选定的对象的属性,可以使用Object Space。当SetTaskAction在详细信息视图中使用时,查看的对象空间用于操纵当前对象。在列表视图中使用Action时,将通过XafApplication.CreateObjectSpace方法创建一个新的ObjectSpace。该ObjectSpace帮助操纵View的选定对象。

    注意

    当您要修改当前显示的多个对象时,请创建一个单独的对象空间。这种方法提高了性能,因为网格控件的事件不会在每次对象更改时触发。在上面的代码中,当当前视图为列表视图时,将创建一个新的对象空间

    在ASP.NET Web应用程序中,“详细视图”以“查看”和“编辑”模式显示。当SetTaskAction为激活DemoTask视图模式详细查看,对所做的更改DemoTask.Priority属性应保存到数据库中。为此,将调用当前View的View.ObjectSpace的BaseObjectSpace.CommitChanges方法。为DemoTask列表视图激活SetTaskAction时,将使用相同的技术。但是,当您在“编辑”模式下的DemoTask详细视图中使用SetTaskAction时,可以通过相应的内置Action保存或回滚更改。

  • 对于当前选定的对象,“优先级”或“状态”属性将被更改。但是,在ASP.NET Web应用程序中使用的网格编辑器没有选择对象,直到最终用户手动选择一个对象。因此,在未选择任何对象的情况下,请禁用“操作”。为此,请将Action的ActionBase.SelectionDependencyType属性设置为RequireMultipleObjects。The Action will be available only when one or more objects are selected. 要指定此属性,请使用“属性”窗口。
  • 运行Windows窗体或ASP.NET应用程序。在导航控件中选择任务项。将显示“设置任务操作”。在“任务列表”视图中选择一个或多个任务对象,然后在“操作”的下拉列表中选择一个项目。所选任务对象的“优先级”或“状态”属性将被修改。

    Tutorial_EF_Lesson5_3_0

    Tutorial_EF_Lesson5_3_2

您可以在MySolution.Module |中看到此处演示的代码。控制器| 与XAF一起安装的Main Demo的TaskActionsController.csTaskActionsController.vb)文件。该MainDemo应用程序安装在%PUBLIC%\文件\ DevExpress的演示19.2 \组件\ eXpressApp框架\ MainDemo默认。可从http://demos.devexpress.com/XAF/MainDemo/在线获得ASP.NET版本。

下一课: 使用属性添加简单操作

相关文章

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