標籤:winform style blog http color io os 使用 ar
在WinForm平台下,C1FlexGrid控制項有提供PrintGrid方法實現列印。但針對列印多個C1FlexGrid,只能使用迴圈列印,每次都要預覽,然後一個個的列印。這樣未免太麻煩。那麼,有沒有更好的列印多個C1FlexGrid的方法呢?
本文就來討論如何將多個C1FlexGrid一次性展示出來,讓使用者更快速和靈活的選擇列印方式。
載入多個C1FlexGrid
添加多個C1FlexGrid,本文的樣本中添加了2個C1FlexGrid到表單,並且通過DataSource給他們綁定不同的資料來源。
然後聲明全域變數fxCollection,並在FormLoad事件中將這些C1FlexGrid都添加到List中。代碼如下:
?
| 1234 |
List<C1FlexGrid> fxCollection;fxCollection = new List<C1FlexGrid>();fxCollection.Add(_flex);fxCollection.Add(c1FlexGrid1); |
設計預覽列印表單
建立一個新的表單,並在該表單上拖拽C1PrintPreviewControl,為之後C1FlexGrid的預覽列印做好準備。
具體代碼可以參考附件Sample。
將多個C1FlexGrid列印到PrintDocument裡調用PrintDcoment的PrintPage和EndPring事件
聲明一個PrintDocument並且調用它的PrintPage和EndPring事件。並且將這個PrintDocument設定到C1PrintPreviewControl上,展示預覽列印對話方塊。
有關PrintPage和EndPring這兩個事件的處理在後面詳細介紹。
代碼參考:
?
| 123456789101112131415 |
void _btnCustom_Click(object sender, EventArgs e) { _flexCurrent = 0; // create regular PrintDocument, attach event handlers var doc = new PrintDocument(); doc.PrintPage += doc_PrintPage; doc.EndPrint += doc_EndPrint; // show new document in Custom print preview dialog using (var dlg = new C1PrintPreview.C1PrintPreviewDialog()) { dlg.Document = doc; dlg.ShowDialog(); } } |
PrintDocumentGridRenderer
在這裡我們要使用一個很重要的類PrintDocumentGridRenderer,在PrintPage事件裡,將全域變數聲明的PrintDocumentGridRenderer傳入C1FlexGrid,就能使用它的PrintPage方法將當前的頁列印到document裡。
PringPage事件通過e.HasMorePage判斷是否還需要列印下一頁。這時候需要添加兩個判斷條件保證繼續列印,一個是當前的FlexGrid還有頁沒打完,另一個是多個C1FlexGrid還未全部列印完成。
定義的全域變數int _flexCurrent,是用來對當前列印到哪個List裡儲存的哪個C1FlexGrd,並通過這個變數將當前的C1FlexGrid傳入到PrintDocumentGridRenderer中,帶這個C1FlexGrid的頁面全部列印完成。計數加一,並且傳入下一個C1FlexGrid繼續列印。
代碼如下:
?
| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
PrintDocumentGridRenderer _pdr; int _flexCurrent; void doc_PrintPage(object sender, PrintPageEventArgs e) { if (_flexCurrent == 0 || _pdr.CurrentPage >= _pdr.PageCount) { _pdr = new PrintDocumentGridRenderer(fxCollection[_flexCurrent]); _pdr.Options = PrintGridFlags.ActualSize; // print header on first page of c1flexgrid if (_pdr.CurrentPage == 0) { using (var font = new Font("Verdana", 14, FontStyle.Bold)) { // render the title var title = fxCollection[_flexCurrent].Tag.ToString(); e.Graphics.DrawString(title, font, Brushes.Black, e.MarginBounds.Location); // push the grid rendering down to make room for the title _pdr.FirstPageY = e.MarginBounds.Location.Y + (int)e.Graphics.MeasureString(title, font).Height; } } _flexCurrent++; } //// print the current page _pdr.PrintPage(e); // print a header on all pages var header = string.Format("Page {0}/{1}", _pdr.CurrentPage, _pdr.PageCount); var rc = new Rectangle(e.MarginBounds.X, 0, e.MarginBounds.Width, e.MarginBounds.Bottom); using (var font = new Font("Verdana", 10, FontStyle.Bold)) { e.Graphics.DrawLine(Pens.Blue, rc.X, rc.Bottom, rc.Right, rc.Bottom); e.Graphics.DrawString(header, font, Brushes.Blue, e.MarginBounds.Left, e.MarginBounds.Bottom);//, fmt); } e.HasMorePages = _pdr.CurrentPage < _pdr.PageCount || _flexCurrent < fxCollection.Count; } void doc_EndPrint(object sender, PrintEventArgs e) { // done, we no longer need the PrintDocumentGridRenderer. _pdr = null; } |
運行結果展示
最後,就會得到如附件所示的Sample,運行起來的效果如所示:
在這個表單上展示了兩個C1FlexGrid,並且綁定不同的資料來源。第一個C1FlexGrid有 4頁資料,第二個C1FlexGrid有3頁資料。
點擊AdvancePrint按鈕,就會彈出如下對話方塊預覽列印:
我們可以看到C1FlexGrid已經顯示在這個預覽列印框裡,並且顯示一共有七頁。
這個時候,使用者只要單擊列印按鈕,就能輕鬆的將多個C1FlexGrid一次性列印出來。
http://blog.gcpowertools.com.cn/post/2014/09/25/C1FlexGridPrint.aspx
一次性列印多個C1FlexGrid