因为报表打印纸张是固定的,但是数据是动态的,尝尝有的列数据会内容多,需要换行显示,而有些数据有较少,一行空间较大,所以我们会很希望,报表更智能点,能够根据数据项的长度来自动调节列宽,那本文就来介绍如何实现动态修改列宽的功能。
1. 新建WinForm 程序
2. 新建区域报表
3. 为区域报表绑定数据
4. 选择区域报表的脚本选项,实现ActiveReport_ReportStart 方法
public void ActiveReport_ReportStart(){}
5. 实现GetColumnWidth 方法,根据数据库的数据长度设置宽度。
public float GetColumnWidth(){using (SqlConnection connection = new SqlConnection("user id=sa;data source=localhost;initial catalog=TestDB1;password=xA123456;")){SqlDataAdapter adapter = new SqlDataAdapter("select top 1 列宽 from 报表列宽 ", connection);DataTable dt = new DataTable();
adapter.Fill(dt);return float.Parse(dt.Rows[0][0].ToString());}}
6. 完善ActiveReport_ReportStart 方法
动态设置列宽,并修改相关数据控件的坐标值。
public void ActiveReport_ReportStart(){float oldWidth = 0;
float newWidth = GetColumnWidth();
// 查找到产品名称列
ARControl lbHeader = null;
foreach (ARControl item in this.pageHeader.Controls){if (item.Name == "lbHProductName"){oldWidth = item.Width;item.Width = newWidth;lbHeader = item;}}foreach (ARControl item in this.pageHeader.Controls){if (item.Name.StartsWith("lbH") & item.Location.X > lbHeader.Location.X){item.Location = new PointF(item.Location.X + newWidth - oldWidth, item.Location.Y);
}}foreach (ARControl item in this.pageHeader.Controls){if (item.Name == "txtDProductName"){oldWidth = item.Width;item.Width = newWidth;lbHeader = item;}}foreach (ARControl item in this.detail.Controls){if (item.Name == "txtDProductName"){item.Width = newWidth;}else if (item.Name.StartsWith("txtD") & item.Location.X > lbHeader.Location.X){item.Location = new PointF(item.Location.X + newWidth - oldWidth, item.Location.Y);
}}}
源码下载:
您在使用产品过程中有任何疑问,可以登录葡萄城开发者社区和经验丰富的技术工程师、ActiveReports开发人员交流:了解更多。
了解ActiveReports产品更多特性:
下载产品体验产品功能: