水晶报表显示任意列并保持列宽总和不变

水晶报表显示任意列并保持列宽总和不变

本文为实现在水晶报表中显示任意列,并且无论显示多少列,要保持列宽总和不变,即当显示的列数比较少时,不能让其“缩”在左侧,而导致右侧一片放空,就是要实现根据列数的多少让其具有“自动拉伸”的效果。
本文实现的效果是显示3~8列,望能给各位起到一定的参考作用:
因最多显示8列,故先在模板放置8个字段对象

 

模板看似简单,但它对尺寸的控制要求很高,不仅每个对象大小要保持一样,并且对对象间的间距控制也半点马虎不得,比如这里每个对象的宽度为1353,列1的Left属性为105,所以列2的Left属性=105+1353+40=1498,列3的Left属性=1498+1353+40……依此类推得其余列的Left属性值,中间的40是对象边框的宽度。这边模板的精确设计是为了获得 列宽总和,因为这个列宽总和始终保持不变,无论当前显示多少列

最少显示3列,故对后面五列设置抑制显示,当然要加上抑制显示条件,其中有一个参数字段OptionNum,表示当前要显示的总列数

模板就是这样,我们再来看看关键代码段,本文最最关键的正是如何动态控制对象的尺寸并以此来达到“自动拉伸”的效果

[c-sharp] view plain copy print ?
  1. /// <summary>   
  2. /// 强类型数据集,水晶报表“骨架”   
  3. /// </summary>   
  4. DataSet1 myDataSet = new DataSet1();  
  5. /// <summary>   
  6. /// “查看报表”按钮事件   
  7. /// </summary>   
  8. private void btnShowReport_Click(object sender, EventArgs e)  
  9. {  
  10.     int DisplayColumnNum;  
  11.     if (!int.TryParse(comboBox1.Text, out DisplayColumnNum))  
  12.     {  
  13.         DisplayColumnNum = 8; //默认显示8列  
  14.     }  
  15.     //把要显示的列数以参数形式传给水晶报表   
  16.     myReport.SetParameterValue("OptionNum", DisplayColumnNum);  
  17.     DisplayColumnByN(DisplayColumnNum);//这里尺寸控制是关键  
  18.     crystalReportViewer1.ReportSource = myReport;  
  19. }  
  20. /// <summary>   
  21. /// 控制报表显示的列数及其尺寸控制   
  22. /// 无论显示多少列,控制所有列宽的总和保持一致   
  23. /// 【本方法也正是本文最最核心的片段】   
  24. /// </summary>   
  25. /// <param name="N">欲显示的列数</param>  
  26. private void DisplayColumnByN(int N)  
  27. {  
  28.     /****************特 别 说 明************************************ 
  29.      * 前面精确的模板设计至关重要,半点马虎不得,最终的效果都在此一举 
  30.      * 因为我们对每个对象加了左右边框,在水晶报表里面,‘单线’边框占 
  31.      * 40(di),勿忘了考虑这个宽度。 
  32.      * 在设计的时候,我把两个相邻对象之间的右边框和左边框“叠”在了一起, 
  33.      * 所以两个对象间只需考虑一个40,不用考虑2*40=80(di)单位的宽度 */  
  34.   
  35.   
  36.     //由于列宽总和要保持一致,故需先获取总宽度   
  37.     int tableWidth = 1353 * 8 + 7 * 40; //1353为对象宽度,40为边框宽度  
  38.   
  39.     //设置当前每一列的宽度,必须先减掉中间边框的宽度再均分  
  40.     int columnWidth = (tableWidth - (N - 1) * 40) / N;  
  41.     //标识 列序号   
  42.     int columnOrder = 1;  
  43.     //遍历详细节的对象   
  44.     foreach (ReportObject obj in ((CrystalReport1)myReport).Section3.ReportObjects)  
  45.     {  
  46.         //列1的Left属性(105)保持不变   
  47.         obj.Left = 105 + (columnWidth + 40) * (columnOrder - 1);  
  48.         obj.Width = columnWidth;  
  49.         columnOrder++;  
  50.     }  
  51. }  
  52. /// <summary>   
  53. /// 全局水晶报表对象   
  54. /// </summary>   
  55. ReportDocument myReport;  
  56. /// <summary>   
  57. /// 窗体关闭后立即删除水晶报表产生的临时文件,避免过多临时文件从而导致“报表加载失败”  
  58. /// </summary>   
  59. private void rptForm_FormClosing(object sender, FormClosingEventArgs e)  
  60. {  
  61.     myReport.Dispose();  
  62. }  
  63. /// <summary>   
  64. /// 填充水晶报表“骨架”并为水晶报表设定数据源   
  65. /// </summary>   
  66. private void rptForm_Load(object sender, EventArgs e)  
  67. {  
  68.     //往数据集“塞”测试数据   
  69.     myDataSet.MultipleColTable.AddMultipleColTableRow("行一""行一""行一""行一""行一""行一""行一""行一");  
  70.     myDataSet.MultipleColTable.AddMultipleColTableRow("行二""行二""行二""行二""行二""行二""行二""行二");  
  71.     myDataSet.MultipleColTable.AddMultipleColTableRow("行三""行三""行三""行三""行三""行三""行三""行三");  
  72.     myDataSet.MultipleColTable.AddMultipleColTableRow("行四""行四""行四""行四""行四""行四""行四""行四");  
  73.     myDataSet.MultipleColTable.AddMultipleColTableRow("行五""行五""行五""行五""行五""行五""行五""行五");  
  74.   
  75.     myReport = new CrystalReport1();  
  76.     myReport.SetDataSource(myDataSet);  
  77. }  

最后的效果图

 来自:http://blog.csdn.net/luols/article/details/6041763

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值