本文爲實現在水晶報表中顯示任意列,並且無論顯示多少列,要保持列寬總和不變,即當顯示的列數比較少時,不能讓其“縮”在左側,而導致右側一片放空,就是要實現根據列數的多少讓其具有“自動拉伸”的效果。
本文實現的效果是顯示3~8列,望能給各位起到一定的參考作用:
因最多顯示8列,故先在模板放置8個字段對象
模板看似簡單,但它對尺寸的控制要求很高,不僅每個對象大小要保持一樣,並且對對象間的間距控制也半點馬虎不得,比如這裏每個對象的寬度爲1353,列1的Left屬性爲105,所以列2的Left屬性=105+1353+40=1498,列3的Left屬性=1498+1353+40……依此類推得其餘列的Left屬性值,中間的40是對象邊框的寬度。這邊模板的精確設計是爲了獲得 列寬總和,因爲這個列寬總和始終保持不變,無論當前顯示多少列
最少顯示3列,故對後面五列設置抑制顯示,當然要加上抑制顯示條件,其中有一個參數字段OptionNum,表示當前要顯示的總列數
模板就是這樣,我們再來看看關鍵代碼段,本文最最關鍵的正是如何動態控制對象的尺寸並以此來達到“自動拉伸”的效果
- /// <summary>
- /// 強類型數據集,水晶報表“骨架”
- /// </summary>
- DataSet1 myDataSet = new DataSet1();
- /// <summary>
- /// “查看報表”按鈕事件
- /// </summary>
- private void btnShowReport_Click(object sender, EventArgs e)
- {
- int DisplayColumnNum;
- if (!int.TryParse(comboBox1.Text, out DisplayColumnNum))
- {
- DisplayColumnNum = 8; //默認顯示8列
- }
- //把要顯示的列數以參數形式傳給水晶報表
- myReport.SetParameterValue("OptionNum", DisplayColumnNum);
- DisplayColumnByN(DisplayColumnNum);//這裏尺寸控制是關鍵
- crystalReportViewer1.ReportSource = myReport;
- }
- /// <summary>
- /// 控制報表顯示的列數及其尺寸控制
- /// 無論顯示多少列,控制所有列寬的總和保持一致
- /// 【本方法也正是本文最最核心的片段】
- /// </summary>
- /// <param name="N">欲顯示的列數</param>
- private void DisplayColumnByN(int N)
- {
- /****************特 別 說 明************************************
- * 前面精確的模板設計至關重要,半點馬虎不得,最終的效果都在此一舉
- * 因爲我們對每個對象加了左右邊框,在水晶報表裏面,‘單線’邊框佔
- * 40(di),勿忘了考慮這個寬度。
- * 在設計的時候,我把兩個相鄰對象之間的右邊框和左邊框“疊”在了一起,
- * 所以兩個對象間只需考慮一個40,不用考慮2*40=80(di)單位的寬度 */
- //由於列寬總和要保持一致,故需先獲取總寬度
- int tableWidth = 1353 * 8 + 7 * 40; //1353爲對象寬度,40爲邊框寬度
- //設置當前每一列的寬度,必須先減掉中間邊框的寬度再均分
- int columnWidth = (tableWidth - (N - 1) * 40) / N;
- //標識 列序號
- int columnOrder = 1;
- //遍歷詳細節的對象
- foreach (ReportObject obj in ((CrystalReport1)myReport).Section3.ReportObjects)
- {
- //列1的Left屬性(105)保持不變
- obj.Left = 105 + (columnWidth + 40) * (columnOrder - 1);
- obj.Width = columnWidth;
- columnOrder++;
- }
- }
- /// <summary>
- /// 全局水晶報表對象
- /// </summary>
- ReportDocument myReport;
- /// <summary>
- /// 窗體關閉後立即刪除水晶報表產生的臨時文件,避免過多臨時文件從而導致“報表加載失敗”
- /// </summary>
- private void rptForm_FormClosing(object sender, FormClosingEventArgs e)
- {
- myReport.Dispose();
- }
- /// <summary>
- /// 填充水晶報表“骨架”併爲水晶報表設定數據源
- /// </summary>
- private void rptForm_Load(object sender, EventArgs e)
- {
- //往數據集“塞”測試數據
- myDataSet.MultipleColTable.AddMultipleColTableRow("行一", "行一", "行一", "行一", "行一", "行一", "行一", "行一");
- myDataSet.MultipleColTable.AddMultipleColTableRow("行二", "行二", "行二", "行二", "行二", "行二", "行二", "行二");
- myDataSet.MultipleColTable.AddMultipleColTableRow("行三", "行三", "行三", "行三", "行三", "行三", "行三", "行三");
- myDataSet.MultipleColTable.AddMultipleColTableRow("行四", "行四", "行四", "行四", "行四", "行四", "行四", "行四");
- myDataSet.MultipleColTable.AddMultipleColTableRow("行五", "行五", "行五", "行五", "行五", "行五", "行五", "行五");
- myReport = new CrystalReport1();
- myReport.SetDataSource(myDataSet);
- }
最後的效果圖