以下内容全部为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中支持的列表自由编辑还有有很多不支持的功能,这样折中处理一下也不错。

 

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

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

    著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 ...

  2. Office 2013 Excel 打开文档很慢很慢的解决方法

    这个问题查了很多案例,试了很多方法,但是只有下面这个方法有用! 这几天打开excel文档很慢很慢,双击之后好久没反应,过会儿它才慢慢冒出来,当时将就了,刚刚休息的时候想着查一下吧,不然很影响工作效率! ...

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

    投诉公司: 北京直信创邺数码科技有限公司  标题: 写在315前夕:苹果售后在没有三包的情况下帮小偷翻新.助力小偷换机销赃!无视王法.让人震惊,痛心,憎恨!消费者很受伤很无奈 期望: 还我手机,或者赔 ...

  4. 迅雷9、迅雷极速版之迅雷P2P加速:流量吸血鬼?为什么你装了迅雷之后电脑会感觉很卡很卡?

    原文地址:http://www.whosmall.com/post/90 关闭极速版迅雷ThunderPlatform.exe进程 ThunderPlatform.exe目的:利用P2P技术进行用户间 ...

  5. mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊

    mybatis返回list很智能很简答的,只需要配置resultmap进行类型转换,你dao方法直接写返回值list<对应的object>就行了啊 dao方法 public List< ...

  6. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  7. 超强干货,11个灰常实用的AI设计小技巧!

    11个超级实用的AI设计小技巧!涉及到很多的实用操作,纯干货经验总结,灰常值得收藏,赶快转走学起来吧! ​编辑:千锋UI设计

  8. 很全面的WinRAR实用技巧系列 - imsoft.cnblogs

    WinRAR也可以管理我的桌面时间长了,桌面上堆的东西实在太多,平时该如何管理呢?安装了WinRAR的朋友可以请它来帮忙,用它管理清除无用的桌面文件或图标. 以XP系统为例,系统所在目录是“c:\wi ...

  9. PHP编码规范整理,很全很实用(图文版)

    有一个组织叫做“php互操作性框架制定小组”,这个小组的主要目的是制定各种PHP编码规范的,下面就是我根据小组提供的建议整理的一些常用的编码规范. PSR-1: 1.PHP代码文件必须以<?ph ...

随机推荐

  1. 发布一款Github博客皮肤

    Major是一款基于jekyll的皮肤,没有用hexo,原因是换机器后无法更新博客,但是可以用U盘考环境.总之很麻烦!折腾纠结好久,还是用jekyll!不用发布直接push文章即可,方便快捷.用的放心 ...

  2. Windows Phone 十一、MVVM模式

    MVVM 模式介绍 模型-视图-视图模型 (MVVM) 是一种用来分离 UI 和非 UI 代码的应用设计模式 MVVM – 模型(Model) MVVM 中的 Model 与 MVC 中的一致,用于封 ...

  3. NDK开发—基础知识实战Demo

    简介 前面写了几篇NDK相关的文章: NDK开发-简介&环境搭建(Eclipse,Android Studio) NDK开发-Android Studio+gradle-experimenta ...

  4. 基于Centos7+Nginx+Tomcat8的负载均衡服务器的搭建

    由于工作的需求,在使用中,需要搭建负载均衡,研究了Apache+Tomat负载均衡的方案,并且通过检索相关的文章,进行了比较发现,Apache负载负载均衡在使用的效率上,远远不如Nginx的效率高,因 ...

  5. 论文阅读(Xiang Bai——【TIP2014】A Unified Framework for Multi-Oriented Text Detection and Recognition)

    Xiang Bai--[TIP2014]A Unified Framework for Multi-Oriented Text Detection and Recognition 目录 作者和相关链接 ...

  6. C++之检测文件结尾

    当使用文件作为输入流时,为了确保适时的结束文件读取操作,程序要靠检查文件尾来判断该何时停止读取.常用的检查文件尾方法有两种: 两种方式均已将 fin 与文件关联,即 均已声明 fin 输入流,并已调用 ...

  7. MySql中文乱码

    [mysqld]## UTF 8 Settings#init-connect=\'SET NAMES utf8\'collation_server=utf8_unicode_cicharacter_s ...

  8. Node.js中的Session,不要觉得简单哦。

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...

  9. Visual Studio 2015 显示正忙 正在等待内部操作完成

    网上查到的: 1.关闭IntelliTrace 2.进入项目文件夹有.vs的隐藏文件夹,进去找到和项目一样的名字的文件夹,再找v14文件夹,进去,删掉.suo文件 http://www.cnblogs ...

  10. AB窗体互传参数

    一.找了好几个,都不靠谱,不是说不靠谱,自己感觉太繁琐 二.父窗口传子窗口好传,有两种方法(自己认为比较简单的方法哈), 1第一种方法:在子窗口中新建一个属性:再新建一个方法,当然方法就是把属性个窗体 ...