XAF之在ListView中显示NonPersistent Object

我前一篇文章“XAF之 未解决——无法显示包含nonpersistent对象的ListView”,在数日的搜索下终于解决了,中间还遇到DEV网站维护的苦苦等待,最终还是发现了问题所在,我使用的dev版本是2.5,而在该版本中无法在ListView或DetailView中显示Nonpersistent 对象,会抛出空指针异常,后来我尝试升级到2.11版本,问题不存在了,几天几夜的苦恼终于找到了结果,虽然结果是这样,但总是是有了结果。为了不负这3天熬红眼,还是简单描述一下该主题:怎样在ListView中显示Nonpersistent Object。

1.创建一个BO,用NonPersistentAttribute特性修饰该类;

using System;
using DevExpress.Xpo;
using DevExpress.Persistent.Base;
using DevExpress.Persistent.BaseImpl;

namespace NonPersistentSolution.Module
{
    [NonPersistent]
    public class MyNonPersistentObject : XPObject
    {
        private static int myId = 0;
        public MyNonPersistentObject(Session session)
            : base(session)
        {
            Oid = ++myId;
        }

        public override void AfterConstruction()
        {
            base.AfterConstruction();
            // Place here your initialization code.
        }
        public string ObjectName
        {
            get { return GetPropertyValue<string>("ObjectName"); }
            set { SetPropertyValue<string>("ObjectName", value); }
        }
    }

}
     其中,myId充当该类的主键。

2.添加一个ViewController,并在该ViewController中添加一个PopupWindowShowAction,并订阅其CustomizePopupWindowParams事件。

using System;
using System.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;

using DevExpress.ExpressApp;
using DevExpress.ExpressApp.Actions;
using DevExpress.Persistent.Base;

namespace NonPersistentSolution.Module
{
    public partial class ViewController1 : ViewController
    {
        public ViewController1()
        {
            InitializeComponent();
            RegisterActions(components);
        }

        private void popupWindowShowAction1_CustomizePopupWindowParams(object sender, CustomizePopupWindowParamsEventArgs e)
        {
            IObjectSpace objectspace = ObjectSpaceInMemory.CreateNew();
            CollectionSource cs = new CollectionSource(objectspace, typeof(MyNonPersistentObject));
            MyNonPersistentObject mo = objectspace.CreateObject<MyNonPersistentObject>();
            mo.ObjectName = "A NonPersistentObject";
            cs.Add(mo);
            ListView view = Application.CreateListView(Application.FindListViewId(typeof(MyNonPersistentObject)), cs, false);
            e.View = view;
        }
    }
}
CustomizePopupWindowParams处理函数中用到了ObjectSpaceInMemory,该类是一个静态类,仅提供了两个CreateNew静态方法,用于创建一个ObjectSpace对象,该ObjectSpace使用内存作为存储介质,适用于保存NonPersistent对象,唯一要求是该ObjectSpace持有的对象必须用NonPersistentAttribute修饰,然后其他使用方法和普通ObjectSpace没有区别。实际上,ObjectSpaceInMemory创建了一个DataSet,将所有数据都保存在里面。

             另外,CollectionSource主要供ListView显示其拥有的对象集合。

 下面是效果图:



                   另外附上一张数据库的截图,可以看到数据库中的确没有创建MyNonPersistentObject表(如果有就奇怪了,算我画蛇添足)。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值