您的位置:首页 > 编程语言 > C#

DEV XtraReport 动态构建报表之设计器的定制

2017-03-16 14:57 721 查看
  DEV自带的报表控件也是比较强大的,主要是可开发性很高,如果有足够精力的话完全可以探索到极致,由于时间的因素,在这里讲一讲如何通过代码动态生成定制化的报表设计器以及比较可观的报表,省去了在VS里一步步操作的步骤。

  首先需要说明的就是报表在界面的显示方式,用到的是documentViewer控件,直接绑定报表文件即可:

XtraReport rpt = new XtraReport();
//将报表与控件关联
documentViewer1.DocumentSource = rpt;
//这一句必须要,参数为true则是在后台加载,报表数据量大的时候建议采用这种方式
//没有参数的加载方式就是等所有数据加载好了再显示,不推荐
rpt.CreateDocument(true);

接下来仔细说说今天的话题:

1. XtraReport设计界面的定制

  所谓定制,当然是对其设计界面进行一些自定义的操作,比如显示或者隐藏某个面板、某个按钮,再者增加或者删除某个事件等等。如果不需要这些定制的话,就只需要直接用报表自带的方法调出设计器即可,如下:
//ribbon界面的设计器
rpt.ShowRibbonDesigner();
//普通界面设计器
rpt.ShowDesigner();

  默认报表设计器个人觉得布局不大合理,用起来也不够方便,很多面板其实是可以停靠的,图片如下:



  我们自己加载设计器,然后进行定制化的操作之后,界面可以顺心很多,代码和效果如下:
XRDesignRibbonForm designForm = new XRDesignRibbonForm();
//加载要设计的报表
designForm.OpenReport(rpt);
//隐藏部分按钮
designForm.DesignRibbonController.XRDesignPanel.SetCommandVisibility(new ReportCommand[]{
ReportCommand.NewReport,
ReportCommand.SaveFileAs,
ReportCommand.NewReportWizard,
ReportCommand.OpenFile
}, CommandVisibility.None);
// 设置各面板的停靠位置以及是否显示
designForm.DesignDockManager[DesignDockPanelType.PropertyGrid].Dock = DevExpress.XtraBars.Docking.DockingStyle.Fill;
designForm.DesignDockManager[DesignDockPanelType.PropertyGrid].DockAsTab(designForm.DesignDockManager[DesignDockPanelType.FieldList], 0);
designForm.DesignDockManager[DesignDockPanelType.ErrorList].DockTo(DevExpress.XtraBars.Docking.DockingStyle.Left);
designForm.DesignDockManager[DesignDockPanelType.GroupAndSort].DockAsTab(designForm.DesignDockManager[DesignDockPanelType.ErrorList], 0);
designForm.DesignDockManager[DesignDockPanelType.ToolBox].Visibility = DevExpress.XtraBars.Docking.DockVisibility.Hidden;
//添加设计器关闭时的事件
designForm.FormClosing += new FormClosingEventHandler(designForm_FormClosing);
//报表状态发生改变时触发的事件
designForm.DesignRibbonController.XRDesignPanel.ReportStateChanged += new ReportStateEventHandler(XRDesignPanel_ReportStateChanged);
// 打开设计器
designForm.ShowDialog();




  加载好之后,你会发现设计器的数据源就是你所加载的报表的数据源,这个很重要,下一篇我会着重讲讲xtrareport对报表以及数据源的动态控制。这时如果你对报表进行了操作,每次关闭时都会弹出对话框问你是否保存,而且其保存的形式竟然是保存为资源文件,我们不可能每次设计时都要保存一次文件,所以上面写到的两个事件就能派上用场了。

  要想它不弹出保存对话框,我们必须更改报表的状态:
void XRDesignPanel_ReportStateChanged(object sender, ReportStateEventArgs e)
{
if (e.ReportState == ReportState.Changed)
{
//状态发生改变,立刻设为保存状态
((XRDesignPanel)sender).ReportState = ReportState.Saved;
}
}
这样它就不会每次都要我们保存文件了,但是是否需要保存修改还是要判断的:
private void designForm_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult dlgResult = MessageBox.Show("是否保存更改?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning);
if (dlgResult == DialogResult.Yes)
{
//这里来执行保存的操作,建议保存为流,这样可以考虑存数据库
MemoryStream ms = new MemoryStream();
rpt.SaveLayout(ms);
//do the save things...
}
else if (dlgResult == DialogResult.Cancel)
{
e.Cancel = true;
}
}


设计器现在基本已经满足我们的要求了,篇幅有限,动态创建报表将会在下一篇里介绍到。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息