Dev利用XRDesignFormEx将报表文件保存至数据库中

最近项目上整合打印模块,之前是将打印报表用文件的形式保存,在代码控制上比较方便,如下图红框的文件保存按钮,点击保存就好了

 这种做法呢也有相应的缺点:报表更新时,需要给每台客户端都更新一遍,比较繁琐,而且容易更新漏。。。

现在的做法是将报表保存至数据库中,这样的话,有报表更新的话,就不用再一台一台客户端繁琐的更新了。

在调研的过程中,习惯性的去找XRDesignFormEx对象有没有保存相关的事件,结果发现并没有,只公开了一个ReportStateChanged事件,显然不能满足需求。

只好继续探索,过程不再熬述,直接上结论吧

XRDesignFormEx对象有一个DesignPanel属性(XRDesignPanel对象),这个对象公开了一个AddCommandHandler的方法,可以基于这个方法给编辑器绑定Command,我们只要实现自己想要的Command就可以了。

话不多说,上代码,

首先继承ICommandHandler接口,实现自己的CommandHandler,代码如下:

    /// <summary>
    /// Dev报表设计命令捕获自定义处理
    /// </summary>
    public class ReportCommandHandler : ICommandHandler
    {
        /// <summary>
        /// 报表保存事件
        /// </summary>
        public event Action ReportSave;

        /// <summary>
        /// 设置支持自定义处理的命令
        /// </summary>
        /// <param name="command"></param>
        /// <param name="useNextHandler"></param>
        /// <returns></returns>
        public bool CanHandleCommand(ReportCommand command, ref bool useNextHandler)
        {
            //捕获保存事件
            if (command == ReportCommand.SaveFile || command == ReportCommand.SaveAll)
            {
                //控制是否执行报表默认处理,此处需要设置为false,屏蔽报表默认Command行为
                useNextHandler = false;
                return true;
            }
            return false;
        }

        /// <summary>
        /// 针对特定命令执行自定义操作
        /// </summary>
        /// <param name="command"></param>
        /// <param name="args"></param>
        public void HandleCommand(ReportCommand command, object[] args)
        {
            if (command == ReportCommand.SaveFile || command == ReportCommand.SaveAll)
            {
                ReportSave?.Invoke();
            }
        }

第二步,将上述自定义的CommandHandler添加至报表编辑器

    var designForm = new XRDesignFormEx
    {
        FormBorderStyle = FormBorderStyle.None,
        Dock = DockStyle.Fill
    };

    //隐藏另存为和保存全部按钮
    designForm.DesignPanel.SetCommandVisibility(new ReportCommand[]
    {
        ReportCommand.SaveFileAs,
        ReportCommand.SaveAll
    }, CommandVisibility.None);

    var command = new ReportCommandHandler();
    command.ReportSave += ReportSave;
    designForm.DesignPanel.AddCommandHandler(command);

第三步,在ReportSave方法中处理保存数据库的逻辑即可

        /// <summary>
        /// 报表保存事件
        /// </summary>
        private void ReportSave()
        {
            try
            {
                using (var memory = new MemoryStream())
                {
                    //将报表文件保存至内存中
                    report.SaveLayout(memory);
                    //转换成字符串
                    var content = Encoding.UTF8.GetString(memory.ToArray());
                    //保存入库操作。。。
               }
            }
            catch (Exception ex)
            {
                MessageBox.Show("保存失败"+ ex.Message, "保存", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

第三部代码中的report对象是在编辑器中打开的报表对象,参考代码如下:

var report = new XtraReport();
//加载模板
using (var templateStream = new MemoryStream(Encoding.UTF8.GetBytes(实际的模板字符串)))
{
    report.LoadLayout(templateStream);
}
//打开模板
designForm.OpenReport(report);

好的,我可以为您提供一些Java代码示例来演示如何利用JDBC将学生信息保存到MySQL数据库。 首先,您需要下载并安装MySQL数据库,并创建一个名为“students”的数据库。然后,您需要在MySQL数据库创建一个名为“student_info”的表,该表包含以下字段:id(int),name(varchar),age(int),gender(varchar)。 接下来,您需要在Java项目添加MySQL驱动程序依赖项。您可以在这里下载MySQL Connector/J驱动程序:https://dev.mysql.com/downloads/connector/j/ 在您的Java代码,您需要连接到MySQL数据库并插入学生信息。以下是示例代码: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/students"; String username = "root";//数据库用户名 String password = "123456";//数据库密码 Connection conn = null; PreparedStatement pstmt = null; String sql = "INSERT INTO student_info(id,name,age,gender) VALUES(?,?,?,?)"; try { //连接数据库 conn = DriverManager.getConnection(url, username, password); //预处理SQL语句 pstmt = conn.prepareStatement(sql); //设置参数 pstmt.setInt(1, 1); pstmt.setString(2, "张三"); pstmt.setInt(3, 20); pstmt.setString(4, "男"); //执行SQL语句 pstmt.executeUpdate(); System.out.println("学生信息插入成功!"); } catch (SQLException e) { e.printStackTrace(); } finally { //关闭资源 try { if (pstmt != null) { pstmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } ``` 在这个示例代码,我们首先定义了连接MySQL数据库所需的URL、用户名和密码。然后,我们使用JDBC连接到数据库,并使用PreparedStatement预处理SQL语句。我们设置了学生信息的参数,并执行SQL语句以将学生信息插入数据库。最后,我们关闭了与数据库的连接和其他资源。 您可以根据需要更改代码的参数和SQL语句,以适应您的实际情况。希望这个示例对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值