当前位置:  编程技术>.net/c#/asp.net

asp.net DataGridView打印预览的实现代码

    来源: 互联网  发布时间:2014-08-30

    本文导语:  DataGridView打印预览 代码示例: #region DataGridView 打印 ----------  private static StringFormat StrFormat;  // Holds content of a TextBox Cell to write by DrawString  private static StringFormat StrFormatComboBox; // Holds content of a Boolean Cell to write by DrawImage  private...

DataGridView打印预览

代码示例:

#region DataGridView 打印 ----------
 private static StringFormat StrFormat;  // Holds content of a TextBox Cell to write by DrawString
 private static StringFormat StrFormatComboBox; // Holds content of a Boolean Cell to write by DrawImage
 private static Button CellButton;       // Holds the Contents of Button Cell
 private static CheckBox CellCheckBox;   // Holds the Contents of CheckBox Cell
 private static ComboBox CellComboBox;   // Holds the Contents of ComboBox Cell

 private static int TotalWidth;   // Summation of Columns widths
 private static int RowPos;       // Position of currently printing row
 private static bool NewPage;     // Indicates if a new page reached
 private static int PageNo;       // Number of pages to print
 private static ArrayList ColumnLefts = new ArrayList();  // Left Coordinate of Columns
 private static ArrayList ColumnWidths = new ArrayList(); // Width of Columns
 private static ArrayList ColumnTypes = new ArrayList();  // DataType of Columns
 private static int CellHeight;   // Height of DataGrid Cell
 private static int RowsPerPage;  // Number of Rows per Page
 private static System.Drawing.Printing.PrintDocument printDoc =
         new System.Drawing.Printing.PrintDocument();  // PrintDocumnet Object used for printing

 private static string PrintTitle = "";  // Header of pages
 private static DataGridView dgvPrint; // Holds DataGridView Object to print its contents
 private static List SelectedColumns = new List();   // The Columns Selected by user to print.
 private static List AvailableColumns = new List();  // All Columns avaiable in DataGrid
 private static bool PrintAllRows = true;   // True = print all rows,  False = print selected rows   
 private static bool FitToPageWidth = true; // True = Fits selected columns to page width ,  False = Print columns as showed   
 private static int HeaderHeight = 0;

 public static void Print_DataGridView(DataGridView dgv)
 {
     PrintPreviewDialog ppvw;
     try
     {
  dgvPrint = dgv;
  // Getting all Coulmns Names in the DataGridView
  AvailableColumns.Clear();
  foreach (DataGridViewColumn c in dgv.Columns)
  {
      if (!c.Visible) continue;
      AvailableColumns.Add(c.HeaderText);
  }

  #region Showing the PrintOption Form
 //create by http://www.
  //PrintOptions dlg = new PrintOptions(AvailableColumns);
  //if (dlg.ShowDialog() != DialogResult.OK) return;

  //PrintTitle = dlg.PrintTitle;
  //PrintAllRows = dlg.PrintAllRows;
  //FitToPageWidth = dlg.FitToPageWidth;
  //SelectedColumns = dlg.GetSelectedColumns();
  #endregion

  #region No PrintOption Form
  PrintTitle = string.Empty;
  PrintAllRows = true;
  FitToPageWidth = true;
  SelectedColumns = AvailableColumns;
  #endregion

  RowsPerPage = 0;

  ppvw = new PrintPreviewDialog();
  ppvw.Document = printDoc;

  // Showing the Print Preview Page
  printDoc.BeginPrint += new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
  printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
  ((Form)ppvw).WindowState = FormWindowState.Maximized;
  if (ppvw.ShowDialog() != DialogResult.OK)
  {
      printDoc.BeginPrint -= new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
      printDoc.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
      return;
  }

  // Printing the Documnet
  printDoc.Print();
  printDoc.BeginPrint -= new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
  printDoc.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
     }
     catch (Exception ex)
     {
  MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
     finally
     {

     }
 }

 private static void PrintDoc_BeginPrint(object sender,
      System.Drawing.Printing.PrintEventArgs e)
 {
     try
     {
  // Formatting the Content of Text Cell to print
  StrFormat = new StringFormat();
  StrFormat.Alignment = StringAlignment.Near;
  StrFormat.LineAlignment = StringAlignment.Center;
  StrFormat.Trimming = StringTrimming.EllipsisCharacter;

  // Formatting the Content of Combo Cells to print
  StrFormatComboBox = new StringFormat();
  StrFormatComboBox.LineAlignment = StringAlignment.Center;
  StrFormatComboBox.FormatFlags = StringFormatFlags.NoWrap;
  StrFormatComboBox.Trimming = StringTrimming.EllipsisCharacter;

  ColumnLefts.Clear();
  ColumnWidths.Clear();
  ColumnTypes.Clear();
  CellHeight = 0;
  RowsPerPage = 0;

  // For various column types
  CellButton = new Button();
  CellCheckBox = new CheckBox();
  CellComboBox = new ComboBox();

  // Calculating Total Widths
  TotalWidth = 0;
  foreach (DataGridViewColumn GridCol in dgvPrint.Columns)
  {
      if (!GridCol.Visible) continue;
      if (!SelectedColumns.Contains(GridCol.HeaderText)) continue;
      TotalWidth += GridCol.Width;
  }
  PageNo = 1;
  NewPage = true;
  RowPos = 0;
     }
     catch (Exception ex)
     {
  MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }

 private static void PrintDoc_PrintPage(object sender,
      System.Drawing.Printing.PrintPageEventArgs e)
 {
     int tmpWidth, i;
     int tmpTop = e.MarginBounds.Top;
     int tmpLeft = e.MarginBounds.Left;

     try
     {
  // Before starting first page, it saves Width & Height of Headers and CoulmnType
  if (PageNo == 1)
  {
      foreach (DataGridViewColumn GridCol in dgvPrint.Columns)
      {
   if (!GridCol.Visible) continue;
   // Skip if the current column not selected
   if (!SelectedColumns.Contains(GridCol.HeaderText)) continue;

   // Detemining whether the columns are fitted to page or not.
   if (FitToPageWidth)
       tmpWidth = (int)(Math.Floor((double)((double)GridCol.Width /
           (double)TotalWidth * (double)TotalWidth *
           ((double)e.MarginBounds.Width / (double)TotalWidth))));
   else
       tmpWidth = GridCol.Width;

   HeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText,
        GridCol.InheritedStyle.Font, tmpWidth).Height) + 11;

   // Save width & height of headres and ColumnType
   ColumnLefts.Add(tmpLeft);
   ColumnWidths.Add(tmpWidth);
   ColumnTypes.Add(GridCol.GetType());
   tmpLeft += tmpWidth;
      }
  }

  // Printing Current Page, Row by Row
  while (RowPos maxHeigth) maxHeigth = height;
   #endregion
   i++;
      }
      #endregion

      CellHeight = maxHeigth;// GridRow.Height;

      if (tmpTop + CellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
      {
   DrawFooter(e, RowsPerPage);
   NewPage = true;
   PageNo++;
   e.HasMorePages = true;
   return;
      }
      else
      {
   if (NewPage)
   {
       // Draw Header
       e.Graphics.DrawString(PrintTitle, new Font(dgvPrint.Font, FontStyle.Bold),
        Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top -
       e.Graphics.MeasureString(PrintTitle, new Font(dgvPrint.Font,
        FontStyle.Bold), e.MarginBounds.Width).Height - 13);

       String s = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();

       e.Graphics.DrawString(s, new Font(dgvPrint.Font, FontStyle.Bold),
        Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width -
        e.Graphics.MeasureString(s, new Font(dgvPrint.Font,
        FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top -
        e.Graphics.MeasureString(PrintTitle, new Font(new Font(dgvPrint.Font,
        FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13);

       // Draw Columns
       tmpTop = e.MarginBounds.Top;
       i = 0;
       foreach (DataGridViewColumn GridCol in dgvPrint.Columns)
       {
    #region 遍历列
    if (!GridCol.Visible) continue;
    if (!SelectedColumns.Contains(GridCol.HeaderText))
        continue;

    e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
        new Rectangle((int)ColumnLefts[i], tmpTop,
        (int)ColumnWidths[i], HeaderHeight));

    e.Graphics.DrawRectangle(Pens.Black,
        new Rectangle((int)ColumnLefts[i], tmpTop,
        (int)ColumnWidths[i], HeaderHeight));

    e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font,
        new SolidBrush(GridCol.InheritedStyle.ForeColor),
        new RectangleF((int)ColumnLefts[i], tmpTop,
        (int)ColumnWidths[i], HeaderHeight), StrFormat);
    i++;
    #endregion
       }
       NewPage = false;
       tmpTop += HeaderHeight;
   }

   // Draw Columns Contents
   i = 0;
   foreach (DataGridViewCell Cel in GridRow.Cells)
   {
       #region 遍历列
       if (!Cel.OwningColumn.Visible) continue;
       if (!SelectedColumns.Contains(Cel.OwningColumn.HeaderText))
    continue;

       // For the TextBox Column
       if (((Type)ColumnTypes[i]).Name == "DataGridViewTextBoxColumn" ||
    ((Type)ColumnTypes[i]).Name == "DataGridViewLinkColumn")
       {
    e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font,
     new SolidBrush(Cel.InheritedStyle.ForeColor),
     new RectangleF((int)ColumnLefts[i], (float)tmpTop,
     (int)ColumnWidths[i], (float)CellHeight), StrFormat);
       }
       // For the Button Column
       else if (((Type)ColumnTypes[i]).Name == "DataGridViewButtonColumn")
       {
    CellButton.Text = Cel.Value.ToString();
    CellButton.Size = new Size((int)ColumnWidths[i], CellHeight);
    Bitmap bmp = new Bitmap(CellButton.Width, CellButton.Height);
    CellButton.DrawToBitmap(bmp, new Rectangle(0, 0,
     bmp.Width, bmp.Height));
    e.Graphics.DrawImage(bmp, new Point((int)ColumnLefts[i], tmpTop));
       }
       // For the CheckBox Column
       else if (((Type)ColumnTypes[i]).Name == "DataGridViewCheckBoxColumn")
       {
    CellCheckBox.Size = new Size(14, 14);
    CellCheckBox.Checked = (bool)Cel.Value;
    Bitmap bmp = new Bitmap((int)ColumnWidths[i], CellHeight);
    Graphics tmpGraphics = Graphics.FromImage(bmp);
    tmpGraphics.FillRectangle(Brushes.White, new Rectangle(0, 0,
     bmp.Width, bmp.Height));
    CellCheckBox.DrawToBitmap(bmp,
     new Rectangle((int)((bmp.Width - CellCheckBox.Width) / 2),
     (int)((bmp.Height - CellCheckBox.Height) / 2),
     CellCheckBox.Width, CellCheckBox.Height));
    e.Graphics.DrawImage(bmp, new Point((int)ColumnLefts[i], tmpTop));
       }
       // For the ComboBox Column
       else if (((Type)ColumnTypes[i]).Name == "DataGridViewComboBoxColumn")
       {
    CellComboBox.Size = new Size((int)ColumnWidths[i], CellHeight);
    Bitmap bmp = new Bitmap(CellComboBox.Width, CellComboBox.Height);
    CellComboBox.DrawToBitmap(bmp, new Rectangle(0, 0,
     bmp.Width, bmp.Height));
    e.Graphics.DrawImage(bmp, new Point((int)ColumnLefts[i], tmpTop));
    e.Graphics.DrawString(Cel.EditedFormattedValue + string.Empty, Cel.InheritedStyle.Font,
     new SolidBrush(Cel.InheritedStyle.ForeColor),
     new RectangleF((int)ColumnLefts[i] + 1, tmpTop, (int)ColumnWidths[i]
     - 16, CellHeight), StrFormatComboBox);
       }
       // For the Image Column
       else if (((Type)ColumnTypes[i]).Name == "DataGridViewImageColumn")
       {
    Rectangle CelSize = new Rectangle((int)ColumnLefts[i],
     tmpTop, (int)ColumnWidths[i], CellHeight);
    Size ImgSize = ((Image)(Cel.FormattedValue)).Size;
    e.Graphics.DrawImage((Image)Cel.FormattedValue,
     new Rectangle((int)ColumnLefts[i] + (int)((CelSize.Width - ImgSize.Width) / 2),
     tmpTop + (int)((CelSize.Height - ImgSize.Height) / 2),
     ((Image)(Cel.FormattedValue)).Width, ((Image)(Cel.FormattedValue)).Height));

       }
       // Drawing Cells Borders
       e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)ColumnLefts[i],
        tmpTop, (int)ColumnWidths[i], CellHeight));

       i++;
       #endregion
   }
   tmpTop += CellHeight;
      }

      RowPos++;
      // For the first page it calculates Rows per Page
      if (PageNo == 1) RowsPerPage++;
      #endregion
  }

  if (RowsPerPage == 0) return;

  // Write Footer (Page Number)
  DrawFooter(e, RowsPerPage);

  e.HasMorePages = false;
     }
     catch (Exception ex)
     {
  MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }

 private static void DrawFooter(System.Drawing.Printing.PrintPageEventArgs e,
      int RowsPerPage)
 {
     double cnt = 0;

     // Detemining rows number to print
     if (PrintAllRows)
     {
  if (dgvPrint.Rows[dgvPrint.Rows.Count - 1].IsNewRow)
      cnt = dgvPrint.Rows.Count - 2; // When the DataGridView doesn't allow adding rows
  else
      cnt = dgvPrint.Rows.Count - 1; // When the DataGridView allows adding rows
     }
     else
  cnt = dgvPrint.SelectedRows.Count;

     // Writing the Page Number on the Bottom of Page
     string PageNum = " 第 " + PageNo.ToString()
      + " 页,共 " + Math.Ceiling((double)(cnt / RowsPerPage)).ToString()
      + " 页";

     e.Graphics.DrawString(PageNum, dgvPrint.Font, Brushes.Black,
  e.MarginBounds.Left + (e.MarginBounds.Width -
  e.Graphics.MeasureString(PageNum, dgvPrint.Font,
  e.MarginBounds.Width).Width) / 2, e.MarginBounds.Top +
  e.MarginBounds.Height + 31);
 }
 #endregion


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c#/ASP.NET操作cookie(读写)代码示例
  • ??谁能把ASP代码改为JSP的
  • asp.net文字水印功能简单代码
  • asp连接sql server 2005的代码
  • asp.net读取本地与全局资料文件的代码
  • asp.net 获取目录中图片的代码
  • asp.net正则表达式提取中文的代码示例
  • 如何在ASP的frame框架中屏蔽右键,以防止查看页面的源代码?
  • asp 正则 过滤重复字符串的代码
  • asp正则过滤重复字符串的代码
  • asp去掉html,保留img br p div的正则实现代码
  • asp.net使用mshtml处理html的代码
  • asp.net 判断当前日期是该年中第几周的代码
  • asp.net中利用正则表达式判断一个字符串是否为数字的代码
  • asp.net弹出消息框、确认框的代码汇总
  • asp.net 获取ashx中数据的代码
  • asp.net防止页面刷新重复提交的代码
  • asp.net读取txt文件内容的代码
  • asp.net文件分块下载的实现代码
  • asp.net 正则表达式匹配图片路径的实现代码
  • [asp]中的正则表达式运用代码
  • ASP.NET之 Ajax相关知识介绍及组件图
  • 我想了解一些关于Java怎样与Asp或Asp.net结合方面在未来发展方向的问题?
  • asp.net UrlEncode对应asp urlencode的处理方法
  • asp.net实例 定义和使用asp:AccessDataSource
  • win2008 r2 服务器环境配置(FTP/ASP/ASP.Net/PHP)
  • asp与asp.net的session共享
  • 如何在unix下发布asp?
  • 怎么让Apache支持Asp?
  • Linux平台下哪种方法实现ASP好?
  • ASP和ASP.Net共享Session解决办法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3