以下内容全部为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. WinForm开发-界面控件到实体,实体到界面控件自动绑定

    在WinForm开发中,我们是不是为绑定界面控件的数据而每个控件每个控件的赋值?在保存修改时是不是也是每个控件每个控件的赋值到实体中?字段一多,那简直就是噩梦.有没有像Web中那样方便的方法直接就自动 ...

  2. ASP.NET MVC EF 中使用异步控制器

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   为什么使用异步操作/线程池 ASP.NET MVC ...

  3. 基于Java Mina框架的部标808服务器设计和开发

    在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...

  4. c/c++ qsort 函数的简单使用(1)

    #include <stdio.h> #include <stdlib.h> //打印数组元素 void print(int arr[], int n){ ; i < n ...

  5. jQuery瀑布流

  6. linux昨天修改的文件

    find ./ -mtime :返回最近24小时内修改过的文件. find ./ -mtime : 返回的是前48~24小时修改过的文件.而不是48小时以内修改过的文件. Linux查找文件内容的常用 ...

  7. Timer的故事----Jdk源码解读

    咱们今天也来说说定时器Timer Timer是什么? Timer  n. [电子] 定时器:计时器:计时员 从翻译来看,我们可以知道Timer的本意是,定时定点. 而JDK中Timer类也的确是这个本 ...

  8. 通过代码获取res里生成R.java中的值

    引用:http://my.eoe.cn/blue_rain/archive/552.html 有的时候我们生成库文件,需要在里面加入一些UI,并提供出一些xml的资源,那如何在其他项目中使用呢? 我们 ...

  9. Meteor全栈开发平台 - 不仅仅是前端

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

  10. 编写高质量ios-之一 OC 语言的起源

    要点 Objective-c为C语言添加了面向对象的特性,是其超级.Objective-c使用动态绑定的消息结构,也就是说,在运行时才会检查对象类型.接受一条消息之后,究竟应执行何种代码,由运行期环境 ...