EPR类企业管理系统

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


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

如何:在弹出对话框中显示非持久对象的列表

本示例演示如何填充和显示未绑定到数据库的对象(非持久对象)的列表。在此示例中,将创建一个存储书籍清单的示例应用程序。在弹出窗口中显示重复书籍列表的动作将添加到此应用程序。

注意

移动应用程序不会在详细视图中显示集合属性中的对象。要在Mobile UI中实现此功能,请按照“导航”主题中的如何:显示非持久对象的列表视图中的说明显示一个列表视图。

提示

可在http://www.devexpress.com/example=E980的DevExpress代码示例数据库中找到完整的示例项目。

  1. 定义Book持久类。

    [DefaultClassOptions]
    public class Book : BaseObject {
        public Book(Session session) : base(session) { }
        public string Title {
            get { return GetPropertyValue<string>(nameof(Title)); }
            set { SetPropertyValue<string>(nameof(Title), value); }
        }
    }
    

    类,顾名思义,是用来表示书。它继承了BaseObject,因此是持久的。它包含一个Title属性,用于存储书籍的标题。

  2. 定义两个非持久类-DuplicateDuplicatesList

    [DomainComponent]
    public class Duplicate {
        [Browsable(false), DevExpress.ExpressApp.Data.Key]
        public int Id;
        public string Title { get; set; }
        public int Count { get; set; }
    }
    [DomainComponent]
    public class DuplicatesList {
        private BindingList<Duplicate> duplicates;
        public DuplicatesList() {
            duplicates = new BindingList<Duplicate>();
        }
        public BindingList<Duplicate> Duplicates { get { return duplicates; } }
    }
    
    注意

    INotifyPropertyChanged的IXafEntityObjectIObjectSpaceLink接口实现在本实施例中被略去。但是,建议在实际应用程序中支持这些接口(请参阅业务类非持久对象中的PropertyChanged事件)。

    这些类不是从XPO基本持久性类继承的,也不会添加到Entity Framework数据模型中。结果,它们不是持久的。应用于这些类的DomainComponentAttribute指示应将这些类添加到应用程序模型,从而将参与UI构造。在复制的非持久化类有三个公共属性-标题计数编号。该标题属性存储一本书的标题。该计数属性存储的书籍由指定的标题总数标题属性。ID是关键属性。需要为非持久类添加键属性,并为每个类实例提供唯一的键属性值,以使ListView正常运行。要指定键属性,请使用KeyAttribute。所述DuplicatesList非持久类经由聚集的重复重复所述的集合属性的BindingList <重复>类型。

  3. 创建以下ShowDuplicateBooksController视图控制器。

    public class ShowDuplicateBooksController : ObjectViewController<ListView, Book> {
        public ShowDuplicateBooksController() {
            PopupWindowShowAction showDuplicatesAction = 
                new PopupWindowShowAction(this, "ShowDuplicateBooks", "View");
            showDuplicatesAction.CustomizePopupWindowParams  = showDuplicatesAction_CustomizePopupWindowParams;
        }
        void showDuplicatesAction_CustomizePopupWindowParams(object sender, CustomizePopupWindowParamsEventArgs e) {
            Dictionary<string, int> dictionary = new Dictionary<string, int>();
            foreach(Book book in View.CollectionSource.List) {
                if(!string.IsNullOrEmpty(book.Title)) {
                    if(dictionary.ContainsKey(book.Title)) {
                        dictionary[book.Title]  ;
                    }
                    else 
                        dictionary.Add(book.Title, 1);
                }
            }
            var nonPersistentOS = Application.CreateObjectSpace(typeof(DuplicatesList));
            DuplicatesList duplicateList =nonPersistentOS.CreateObject<DuplicatesList>();
            int duplicateId = 0;
            foreach(KeyValuePair<string, int> record in dictionary) {
                if (record.Value > 1) {
                    var dup = nonPersistentOS.CreateObject<Duplicate>();
                    dup.Id = duplicateId;
                    dup.Title = record.Key;
                    dup.Count = record.Value;
                    duplicateList.Duplicates.Add(dup);
                    duplicateId  ;
                }
            }
            nonPersistentOS.CommitChanges();
            DetailView detailView = Application.CreateDetailView(nonPersistentOS, duplicateList);
            detailView.ViewEditMode = DevExpress.ExpressApp.Editors.ViewEditMode.Edit;
            e.View = detailView;
            e.DialogController.SaveOnAccept = false;
            e.DialogController.CancelAction.Active["NothingToCancel"] = false;
        }
    }
    

    此Controller继承ObjectViewController < ListViewBook >,因此,目标是显示Books的List View。在Controller的构造函数中,创建ShowDuplicateBooks PopupWindowShowAction。在Action的PopupWindowShowAction.CustomizePopupWindowParams事件处理程序中,对Books进行迭代以查找重复项。对于找到的每本重复书,都将实例化Duplicate对象并将其添加到DuplicatesList.Duplicates集合中。请注意,为每个重复项分配了唯一的键值(Id)。最后是DuplicatesList将创建详细信息视图,并将其传递给处理程序的CustomizePopupWindowParamsEventArgs.View参数。结果,当用户单击ShowDuplicateBooks时,会在弹出窗口中显示DuplicatesList对象。

下图说明了已实现的操作及其弹出窗口。

Windows表单:

ShowDuplicateBooksWin

ASP.NET:

ShowDuplicateBooksWeb

相关文章

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