水晶報表顯示任意列並保持列寬總和不變

水晶報表顯示任意列並保持列寬總和不變

本文爲實現在水晶報表中顯示任意列,並且無論顯示多少列,要保持列寬總和不變,即當顯示的列數比較少時,不能讓其“縮”在左側,而導致右側一片放空,就是要實現根據列數的多少讓其具有“自動拉伸”的效果。
本文實現的效果是顯示3~8列,望能給各位起到一定的參考作用:
因最多顯示8列,故先在模板放置8個字段對象

 

模板看似簡單,但它對尺寸的控制要求很高,不僅每個對象大小要保持一樣,並且對對象間的間距控制也半點馬虎不得,比如這裏每個對象的寬度爲1353,列1的Left屬性爲105,所以列2的Left屬性=105+1353+40=1498,列3的Left屬性=1498+1353+40……依此類推得其餘列的Left屬性值,中間的40是對象邊框的寬度。這邊模板的精確設計是爲了獲得 列寬總和,因爲這個列寬總和始終保持不變,無論當前顯示多少列

最少顯示3列,故對後面五列設置抑制顯示,當然要加上抑制顯示條件,其中有一個參數字段OptionNum,表示當前要顯示的總列數

模板就是這樣,我們再來看看關鍵代碼段,本文最最關鍵的正是如何動態控制對象的尺寸並以此來達到“自動拉伸”的效果

  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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章