XAF点滴:很具体很用实用---处理三个小问题

以下内容全部为web版本的老模板风格下完成。

一、在编辑状态的详细视图下打印报表。

有些时候,需要在编辑状态下直接打印报表内容,官方默认是不允许这样做的。用Reflector查看源码,可以看到:

Declaring Type: DevExpress.ExpressApp.ReportsV2.PrintSelectionBaseController 
Assembly: DevExpress.ExpressApp.ReportsV2.v16.1, Version=16.1.5.0
protected virtual void UpdateActionState()
{
    if (base.View != null)
    {
        this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = true;
        if (this.ShowInReportActionEnableMode == ActionEnabledMode.ModifiedChanged)
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = !base.View.ObjectSpace.IsModified;
        }
        else if ((this.ShowInReportActionEnableMode == ActionEnabledMode.ViewMode) && (base.View is DetailView))
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = ((DetailView) base.View).ViewEditMode == ViewEditMode.View;
        }
    }
}

在这个方法中禁止了显示按钮的逻辑。

ShowInReportActionEnableMode 是在构造函数中做了初始化,如下:
public PrintSelectionBaseController()
{
    base.TypeOfView = typeof(ObjectView);
    this.showInReportAction = new SingleChoiceAction(this, "ShowInReportV2", PredefinedCategory.Reports);
    this.showInReportAction.Caption = "Show in Report";
    this.showInReportAction.ToolTip = "Show selected records in a report";
    this.showInReportAction.Execute += new SingleChoiceActionExecuteEventHandler(this.showInReportAction_Execute);
    this.showInReportAction.ItemType = SingleChoiceActionItemType.ItemIsOperation;
    this.showInReportAction.SelectionDependencyType = SelectionDependencyType.RequireMultipleObjects;
    this.showInReportAction.ImageName = "Action_Report_Object_Inplace_Preview";
    this.ShowInReportActionEnableMode = ShowInReportActionEnableModeDefault;  //<<<<---------------看这里
}
 
ShowInReportActionEnableModeDefault 是一个静态变量。
public static ActionEnabledMode ShowInReportActionEnableModeDefault;

也就是说,可以全局设定行为。 再来详细的看一下如何显示的逻辑:
protected virtual void UpdateActionState()
{
    if (base.View != null)
    {
        this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = true; //默认可以用,但这个名称取的和值是不是很难理解?
        if (this.ShowInReportActionEnableMode == ActionEnabledMode.ModifiedChanged) //标注1
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = !base.View.ObjectSpace.IsModified;
        }
        else if ((this.ShowInReportActionEnableMode == ActionEnabledMode.ViewMode) && (base.View is DetailView)) //这个模式下,只有当前详细视图是查看时才能用。
        {
            this.ShowInReportAction.Enabled["DisableActionWhenThereAreChanges"] = ((DetailView) base.View).ViewEditMode == ViewEditMode.View;
        }
    }
}
标注1:如果 模式设置为ModifiedChanged则, 有编辑的对象,就不可以用这个按钮。看到这里你一定认为,官方不是支持了编辑状态的打印报表了吗?然而,这个ObjectSpace.IsModified的值在没,有编辑时也经常会变为true,即使是刚刚按过保存按钮。我认为用这个值做判断很难控制,不如直接改掉吧。多说一句,官方的考虑是正确的,如:你刚刚修改了内容,没按保存去打印单据,那么结果可能数据库里的内容和打印的结果是不一致的。所以我们进行一下改造。

    public class PrintReportController : PrintSelectionBaseController
    {
        protected override void UpdateActionState()
        {
            if (View is DetailView)
            {
                //详细视图下,都是可用的
            }
            else
            {
                base.UpdateActionState(); //如果不是detailview时,还按原来的逻辑走
            }

        }

        protected override void ShowInReport(SingleChoiceActionExecuteEventArgs e, string reportContainerHandle)
        {
            var dv = View as DetailView;
            if (dv != null && dv.ViewEditMode == DevExpress.ExpressApp.Editors.ViewEditMode.Edit)
            {
                this.ObjectSpace.CommitChanges();
            }//执行按钮前,先保存一下数据
            base.ShowInReport(e, reportContainerHandle);
        }
    }

就是这么简单。

二、让查看状态的视图支持“返回”到上一个视图的功能。

这个相当简单,当做初学者的学习示例吧,但用户还是很需要这个功能的。

    public partial class CloseDetailViewController : ViewController<DetailView>
    {
        public CloseDetailViewController()
        {
            InitializeComponent();
            this.CloseViewModeDetail.Execute += CloseViewModeDetail_Execute;
            // Target required Views (via the TargetXXX properties) and create their Actions.
        }

        private void CloseViewModeDetail_Execute(object sender, SimpleActionExecuteEventArgs e)
        {
            this.View.Close();
        }

        protected override void OnActivated()
        {
            base.OnActivated();
            this.CloseViewModeDetail.Active["InViewMode"] = View.ViewEditMode == ViewEditMode.View; //这个按钮只有在查看状态中显示
            // Perform various tasks depending on the target View.
        }
        protected override void OnViewControlsCreated()
        {
            base.OnViewControlsCreated();
            // Access and customize the target View control.
        }
        protected override void OnDeactivated()
        {
            // Unsubscribe from previously subscribed events and release other references and resources.
            base.OnDeactivated();
        }
    }
//按钮是这样设置的:            this.CloseViewModeDetail.Caption = "返回";
            this.CloseViewModeDetail.Category = "Export";
            this.CloseViewModeDetail.Id = "CloseViewModeDetail";

三、在编辑状态的主表点击明细表时直接转到编辑状态

这个功能也很实用,因为点击编辑按钮有点累,按钮图标太小,如果点击任意行位置,弹出的是查看状态的记录内容。所以现在改变为,如果是编辑状态的主表,弹出的也是编辑状态的界面。

 public partial class DetailItemViewController : ViewController<DetailView>
    {
        public DetailItemViewController()
        {
            InitializeComponent();
        }
        protected override void OnActivated()
        {
            base.OnActivated();
            var os = this.ObjectSpace as XPNestedObjectSpace; //如果有上级详细视图并且是在编辑状态的视图,那把本级别的编辑视图也设置成编辑状态。
            if (os!=null)
            {
                var dv = os.ParentObjectSpace.Owner as DetailView;
                if (dv!=null)
                {
                    this.View.ViewEditMode = dv.ViewEditMode;
                }
            }
            // Perform various tasks depending on the target View.
        }
        protected override void OnViewControlsCreated()
        {
            base.OnViewControlsCreated();
            // Access and customize the target View control.
        }
        protected override void OnDeactivated()
        {
            // Unsubscribe from previously subscribed events and release other references and resources.
            base.OnDeactivated();
        }
    }

现在XAF中支持的列表自由编辑还有有很多不支持的功能,这样折中处理一下也不错。

 
时间: 2024-10-09 10:55:14

XAF点滴:很具体很用实用---处理三个小问题的相关文章

Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 来源:知乎 这个问题quora上有人提过 What are some lesser known but useful Unix commands? ,已经有不少答案了,我个人已经从这些答案中学到不少,这里我只是照搬过来,然后加上自己的解释. lsof: 列出所有打开的文件.举例:'lsof -p

很容易学习的JQuery库 : (三) 事件

jQuery 是为事件处理特别设计的. 一.事件函数 jQuery 事件处理方法是 jQuery 中的核心函数. 事件处理程序指的是当 HTML 中发生某些事件时所调用的方法.术语由事件"触发"(或"激发")经常会被使用. 通常会把 jQuery 代码放到 <head>部分的事件处理方法中: 实例 <span style="font-size:18px;"><html> <head> <scr

思念很痛很苦也很美

思念很痛很苦,但也很美. 随着年龄的增长,社会压力的增大,我慢慢的发现要再像年轻时那样勇敢的去爱一个人,去思念一个人已经变得非常困难了.这难道就是大家常开玩笑的"累觉不爱"吗?我们在感情上变得更加理性,这有好处,但另一方面其实我们慢慢的在变得更加麻木,我们很多时候会用理性去控制感性.我能很清晰的感受到,我已经很难像年轻时那样单纯的去思念一个人了,也许有人说这是成熟,但我觉得为了成熟我付出的代价太大了,我已经慢慢的失去了爱的能力,失去了思念的能力.所以,对于我来说,思念是如此珍贵,思念是

根据之前的博文,我把给同学做的三子棋小游戏的代码发出来,只是界面很丑很丑,AI算法很笨很笨,过几天我传到网盘上,提供大家下载娱乐

1 background_image_filename = 'blackground.png' 2 black_mouse_image_filename = 'black.png' 3 white_mouse_image_filename = 'white.png' 4 restart_icon_filename='restart.png' 5 pingju_icon_filename='pingju.jpg' 6 win_icon_filename='win.jpg' 7 lose_icon_

如果我们很努力很努力,只为了过上平常的生活

换句话说,我没什么天赋,不算太努力,家里没什么背景,接受的教育也就是凑合,也没什么高层次的追求.你觉得我是值得被鄙视的?可一个社会中,最多的就是我这样的人.我人生的目标就是能做个普普通通的人,过普普通通的日子,而这一切,只需要普普通通的努力程度与普普通通的天赋就足够了,这样的人占了总人数的差不多百分之七十,你凭什么觉得这些人都没有权利过上平常但有尊严的生活?实际上我们理应过着平常而有尊严的生活,而且我们最应该过着平常而有尊严的生活--而那些很努力很努力的人,应该过上比我们好得多的生活.如果我们"

那都是很好很好的,可是我偏不喜欢。

/****************************************<白马啸西风>节选 经文替他们解决疑难,大家心中明白了,都说:「穆圣的指示,那是再也不会错的.」有人便称赞哈卜拉姆聪明有学问:「我们有甚麽事情不明白,只要去问哈卜拉姆,他总是能好好的教导我们.」可是哈卜拉姆再聪明.再有学问,有一件事却是他不能解答的,因为包罗万有的「可兰经」上也没有答案:如果你深深爱著的人,却深深的爱上了别人,有甚麽法子?白马带著她一步步的回到中原.白马已经老了,只能慢慢的走,但终是能回到中原的.

一个人奋斗真的很累很孤单

一个人奋斗真的很累很孤单 刚毕业的我,突然由两个人共同奋斗变成了两个人单独奋斗,有点不适应!思念她…可能这是我们应该走的路吧,成长的过程… 希望能有一个好的结果!我喜欢一个人听张韶涵的“隐形的翅膀” .喜欢的部分歌词:带我飞飞过绝望不去想他们拥有美丽的太阳我看见每天的夕阳也会有变化我知道我一直有双隐形的翅膀带我飞给我希望我终于看到所有梦想都开花追逐的年轻歌声多嘹亮我终于翱翔用心凝望不害怕哪里会有风就飞多远吧……

写在315前夕:苹果售后福州直信创邺在没有三包的情况下帮小偷翻新、助力小偷换机销赃!无视王法。让人震惊,痛心,憎恨!消费者很受伤很无奈

投诉公司: 北京直信创邺数码科技有限公司 标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔偿手机:其次曝光送修人姓名联系电话:请苹果,警察,还有苹果售后协助铲除这个黑色产业链.一定要彻查到底 我的手机是2月25日被盗,当时就报警了.27日有带好三包凭证去派出所报案.期间还拨打苹果售后400电话进行被盗登记. 这个是25日晚上在官网查询到的信息,当时还没有被刷机换机. 以下是购机证明: --

一些常用的宏定义(很有用,很有效噢)

// 安全释放 #define RELEASE_SAFELY(__Pointer) do{[__Pointer release],__Pointer = nil;} while(0) // 屏幕的物理高度 #define ScreenHeight [UIScreen mainScreen].bounds.size.height // 屏幕的物理宽度 #define ScreenWidth [UIScreen mainScreen].bounds.size.width // 调试 #define