使用C#打印DataGridView [英] Printing a DataGridView with C#

查看:71
本文介绍了使用C#打印DataGridView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在生成一个dataGridView组件的报告,并希望将其打印出来。我在这个网站上发现了一篇文章,里面有我下载和编译的DataGridViewTestApplication。该应用程序运作良好。我将这些函数复制并粘贴到我的应用程序中,该应用程序在表单上也有一个dataGridView1组件。代码如下:

  private   void  view_all()
{
Cursor.Current = Cursors.WaitCursor;
SqlConnection sqlConnection = null ;
SqlCommand sqlCommand = null ;
SqlDataReader sqlReader = null ;

尝试
{
string strQuery = < span class =code-string> SELECT Name,Telephony,RtGide,Code,Acct,AirDir FROM APRL.dbo.Patchdata,其中Code为'b%' ;
string datasource = Dave-HP \\ \\\SQLEXPRESS;
SqlConnectionStringBuilder bu = new SqlConnectionStringBuilder();
bu.DataSource = @datasource;
bu.IntegratedSecurity = false ; // Sql Server Authentification
bu.UserID = 戴夫;
bu.Password = FunFern;

MSQLcon.ConnectionString = bu.ConnectionString;
// sqlConnection = new SqlConnection(strConnectionString);
MSQLcon.Open( );
sqlCommand = new SqlCommand(strQuery,MSQLcon);
sqlReader = sqlCommand.ExecuteReader();
while (sqlReader.Read())
{
object [] row = {sqlReader [ 0 ],sqlReader [ 1 ],sqlReader [ 2 ],sqlReader [ 3 ],sqlReader [ 4 ], sqlReader [ 5 ]};
dataGridView1.Rows.Add(row);
}
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, 错误,MessageBoxButtons.OK,MessageBoxIcon.Error);
return ;
}
finally
{
Cursor.Current = Cursors.Default;
MSQLcon.Close();
if (sqlReader!= null
{
sqlReader。处置();
sqlReader = null ;
}
如果(sqlCommand!= null
{
sqlCommand.Dispose();
sqlCommand = null ;
}
}
}
#endregion

#region打印按钮单击事件
/// < 摘要 >
/// 处理打印按钮点击事件
/// < / summary >
/// < param name =发件人 > < / param >
/// < param name =e > < / param >

private void aVSRoutingGdToolStripMenuItem_Click( object sender,EventArgs e)
{
view_all();
// 打开打印对话框
PrintDialog printDialog = new PrintDialog();
printDialog.Document = printDocument1;
printDialog.UseEXDialog = true ;

// 获取文档
if (DialogResult.OK == printDialog.ShowDialog())
{
printDocument1.DocumentName = 测试页打印;
printDocument1.Print();
}

// 打开打印预览对话框
/ * PrintPreviewDialog objPPdialog = new PrintPreviewDialog();
objPPdialog.Document = printDocument1;
printDocument1.DefaultPageSettings.Landscape = true;
objPPdialog.ShowDialog(); * /

}
#endregion

#region开始打印事件处理程序
/// < 摘要 > ;
/// 处理打印文档的开始打印事件
/// < < span class =code-summarycomment> / summary >
/ // < param name =sender > < / param >
// / < param name =e > < / param >
private void printDocument1_BeginPrint( object sender, System.Drawing.Printing.PrintEventArgs e)
{
try
{
strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Near;
strFormat.LineAlignment = StringAlignment.Center;
strFormat.Trimming = StringTrimming.EllipsisCharacter;

arrColumnLefts.Clear();
arrColumnWidths.Clear();
iCellHeight = 0 ;
iRow = 0 ;
bFirstPage = true ;
bNewPage = true ;

// 计算总宽度
iTotalWidth = 0 ;
foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns)
{
iTotalWidth + = dgvGridCol.Width;
}
}
catch (例外情况)
{
MessageBox.Show(ex.Message, 错误,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
#endregion

#region打印页面事件
/// < 摘要 >
/// 处理打印文档的打印页面事件
/// < / summary >
/// < param < span class =code-summarycomment> name =sender > < / param >
/// < span class =code-summarycomment>< param name =e > < / param >
private void printDocument1_PrintPage( object sender,System.Drawing.Printing.PrintPageEventArgs e)
{
尝试
{
// 设置左边距
int iLeftMargin = e.MarginBounds.Left;
// 设置上边距
int iTopMargin = e.MarginBounds.Top;
// 是否需要打印更多页面
bool bMorePagesToPrint = false ;
int iTmpWidth = 0 ;

// 要打印的第一页设置单元格宽度和标题高度
if (bFirstPage)
{
foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
{
iTmpWidth =( int )(数学。 Floor(( double )(( double )GridCol.Width /
double )iTotalWidth *( double )iTotalWidth *
(( double )e.MarginBounds.Width /( double )iTotalWidth))));

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

// 保存headres的宽度和高度
arrColumnLefts。加入(iLeftMargin);
arrColumnWidths.Add(iTmpWidth);
iLeftMargin + = iTmpWidth;
}
}
// 循环直到所有网格行都不打印
while (iRow < = dataGridView1.Rows.Count - 1
{
DataGridViewRow GridRow = dataGridView1.Rows [iRow];
// 设置单元格高度
iCellHeight = GridRow.Height + 5 ;
int iCount = 0 ;
// 检查当前页面设置是否还有更多要打印的行
< span class =code-keyword> if (iTopMargin + iCellHeight > = e.MarginBounds.Height + e.MarginBounds.Top)
{
bNewPage = true ;
bFirstPage = false ;
bMorePagesToPrint = true ;
break ;
}
else
{
if (bNewPage )
{
// 绘制标题
e.Graphics。 DrawString( Customer Summary new Font(dataGridView1.Font,FontStyle.Bold),
Brushes.Black,e.MarginBounds.Left,e.MarginBounds.Top -
e.Graphics.MeasureString( 客户摘要字体(dataGridView1.Font,
FontStyle .Bold),e.MarginBounds.Width).Height - 13 );

String strDate = DateTime.Now.ToLongDateString()+ + DateTime.Now.ToShortTimeString();
// 绘制日期
e.Graphics.DrawString(strDate, new 字体(dataGridView1.Font,FontStyle.Bold),
Brushes.Black,e.MarginBounds.Left +(e.MarginBounds.Width -
e .Graphics.MeasureString(strDate, new 字体(dataGridView1.Font,
FontStyle.Bold),e.MarginBounds.Width).Width),e.MarginBounds .Top -
e.Graphics.MeasureString( 客户摘要 new 字体( new 字体(dataGridView1.Font,
FontStyle.Bold),FontStyle.Bold),e。 MarginBounds.Width).Height - 13 );

// 绘制列
iTopMargin = e.MarginBounds。最佳;
foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
{
e.Graphics.FillRectangle( new SolidBrush(Color.LightGray),
new 矩形(( int )arrColumnLefts [iCount],iTopMargin,
int )arrColumnWidths [iCount],iHeaderHeight ));

e.Graphics.DrawRectangle(Pens.Black,
new Rectangle(( int )arrColumnLefts [iCount],iTopMargin,
int )arrColumnWidths [iCount],iHeaderHeight));

e.Graphics.DrawString(GridCol.HeaderText,GridCol.InheritedStyle.Font,
new SolidBrush(GridCol.InheritedStyle.ForeColor ),
new RectangleF(( int )arrColumnLefts [iCount],iTopMargin,
int )arrColumnWidths [iCount],iHeaderHeight),strFormat);
iCount ++;
}
bNewPage = false ;
iTopMargin + = iHeaderHeight;
}
iCount = 0 ;
// 绘制列内容
foreach (DataGridViewCell Cel in GridRow.Cells)
{
if (Cel.Value!= null
{
e.Graphics.DrawString(Cel.Value.ToString(),Cel.InheritedStyle .Font,
new SolidBrush(Cel.InheritedStyle.ForeColor),
new RectangleF(( int )arrColumnLefts [iCount],( float )iTopMargin,
int )arrColumnWidths [iCount],( float )iCel lHeight),strFormat);
}
// 绘制单元格边框
e.Graphics。 DrawRectangle(Pens.Black, new Rectangle(( int )arrColumnLefts [iCount],
iTopMargin ,( int )arrColumnWidths [iCount],iCellHeight));

iCount ++;
}
}
iRow ++;
iTopMargin + = iCellHeight;
}

// 如果存在更多行,则打印另一页。
if (bMorePagesToPrint)
e.HasMorePages = true ;
else
e.HasMorePages = false ;
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, 错误,MessageBoxButtons.OK,MessageBoxIcon.Error);
}
}
#endregion



viewall函数用适当的数据填充dataGridView,这很好用。从菜单选项调用void aVSRoutingGdToolStripMenuItem_Click函数,并首先调用viewall函数来填充数据网格。从那里开始代码是正确的测试程序。但我得到的只是空白页。我的表单上有printDocument1。我认为printDocument不知道从哪里获取数据,但我无法找到如何实现这一点。任何帮助将不胜感激。



谢谢!

Dave Daley

解决方案

< blockquote>这不是一个好主意我的朋友。请阅读这篇文章。有一个方法,你给你的datagridview这个方法,它打印你想要的所有列(Print_DataGridView)。这个:



通过选择列和行进行DataGridView打印 [ ^

I am generating a report into a dataGridView component and want to print it out. I found an article on this site that had a DataGridViewTestApplication which I downloaded and compiled. The application worked well. I copied and pasted the functions into my application which also had a dataGridView1 conponent on the form. The code follows:

 private void view_all()
 {
     Cursor.Current = Cursors.WaitCursor;
     SqlConnection sqlConnection = null;
     SqlCommand sqlCommand = null;
     SqlDataReader sqlReader = null;

     try
     {
         string strQuery = "SELECT Name, Telephony, RtGide, Code, Acct, AirDir FROM APRL.dbo.Patchdata where Code like 'b%'";
         string datasource = "Dave-HP\\SQLEXPRESS";
         SqlConnectionStringBuilder bu = new SqlConnectionStringBuilder();
         bu.DataSource = @datasource;
         bu.IntegratedSecurity = false; // Sql Server Authentification
         bu.UserID = "Dave";
         bu.Password = "FunFern";

         MSQLcon.ConnectionString = bu.ConnectionString;
         //     sqlConnection = new SqlConnection(strConnectionString);
         MSQLcon.Open();
         sqlCommand = new SqlCommand(strQuery, MSQLcon);
         sqlReader = sqlCommand.ExecuteReader();
         while (sqlReader.Read())
         {
             object[] row = { sqlReader[0], sqlReader[1], sqlReader[2], sqlReader[3], sqlReader[4], sqlReader[5] };
             dataGridView1.Rows.Add(row);
         }
     }
     catch (Exception exc)
     {
         MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         return;
     }
     finally
     {
         Cursor.Current = Cursors.Default;
         MSQLcon.Close();
         if (sqlReader != null)
         {
             sqlReader.Dispose();
             sqlReader = null;
         }
         if (sqlCommand != null)
         {
             sqlCommand.Dispose();
             sqlCommand = null;
         }
     }
 }
 #endregion

 #region Print Button Click Event
 /// <summary>
 /// Handles the print button click event
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>

 private void aVSRoutingGdToolStripMenuItem_Click(object sender, EventArgs e)
 {
     view_all();
     //Open the print dialog
           PrintDialog printDialog = new PrintDialog();
           printDialog.Document = printDocument1;
           printDialog.UseEXDialog = true;

           //Get the document
           if (DialogResult.OK == printDialog.ShowDialog())
           {
               printDocument1.DocumentName = "Test Page Print";
               printDocument1.Print();
           }

     //Open the print preview dialog
/*     PrintPreviewDialog objPPdialog = new PrintPreviewDialog();
     objPPdialog.Document = printDocument1;
     printDocument1.DefaultPageSettings.Landscape = true;
     objPPdialog.ShowDialog();*/
 }
 #endregion

 #region Begin Print Event Handler
 /// <summary>
 /// Handles the begin print event of print document
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
 {
     try
     {
         strFormat = new StringFormat();
         strFormat.Alignment = StringAlignment.Near;
         strFormat.LineAlignment = StringAlignment.Center;
         strFormat.Trimming = StringTrimming.EllipsisCharacter;

         arrColumnLefts.Clear();
         arrColumnWidths.Clear();
         iCellHeight = 0;
         iRow = 0;
         bFirstPage = true;
         bNewPage = true;

         // Calculating Total Widths
         iTotalWidth = 0;
         foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns)
         {
             iTotalWidth += dgvGridCol.Width;
         }
     }
     catch (Exception ex)
     {
         MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
 #endregion

 #region Print Page Event
 /// <summary>
 /// Handles the print page event of print document
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
 {
     try
     {
         //Set the left margin
         int iLeftMargin = e.MarginBounds.Left;
         //Set the top margin
         int iTopMargin = e.MarginBounds.Top;
         //Whether more pages have to print or not
         bool bMorePagesToPrint = false;
         int iTmpWidth = 0;

         //For the first page to print set the cell width and header height
         if (bFirstPage)
         {
             foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
             {
                 iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width /
                                (double)iTotalWidth * (double)iTotalWidth *
                                ((double)e.MarginBounds.Width / (double)iTotalWidth))));

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

                 // Save width and height of headres
                 arrColumnLefts.Add(iLeftMargin);
                 arrColumnWidths.Add(iTmpWidth);
                 iLeftMargin += iTmpWidth;
             }
         }
         //Loop till all the grid rows not get printed
         while (iRow <= dataGridView1.Rows.Count - 1)
         {
             DataGridViewRow GridRow = dataGridView1.Rows[iRow];
             //Set the cell height
             iCellHeight = GridRow.Height + 5;
             int iCount = 0;
             //Check whether the current page settings allo more rows to print
             if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
             {
                 bNewPage = true;
                 bFirstPage = false;
                 bMorePagesToPrint = true;
                 break;
             }
             else
             {
                 if (bNewPage)
                 {
                     //Draw Header
                     e.Graphics.DrawString("Customer Summary", new Font(dataGridView1.Font, FontStyle.Bold),
                             Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top -
                             e.Graphics.MeasureString("Customer Summary", new Font(dataGridView1.Font,
                             FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                     String strDate = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString();
                     //Draw Date
                     e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Bold),
                             Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width -
                             e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font,
                             FontStyle.Bold), e.MarginBounds.Width).Width), e.MarginBounds.Top -
                             e.Graphics.MeasureString("Customer Summary", new Font(new Font(dataGridView1.Font,
                             FontStyle.Bold), FontStyle.Bold), e.MarginBounds.Width).Height - 13);

                     //Draw Columns
                     iTopMargin = e.MarginBounds.Top;
                     foreach (DataGridViewColumn GridCol in dataGridView1.Columns)
                     {
                         e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
                             new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                             (int)arrColumnWidths[iCount], iHeaderHeight));

                         e.Graphics.DrawRectangle(Pens.Black,
                             new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                             (int)arrColumnWidths[iCount], iHeaderHeight));

                         e.Graphics.DrawString(GridCol.HeaderText, GridCol.InheritedStyle.Font,
                             new SolidBrush(GridCol.InheritedStyle.ForeColor),
                             new RectangleF((int)arrColumnLefts[iCount], iTopMargin,
                             (int)arrColumnWidths[iCount], iHeaderHeight), strFormat);
                         iCount++;
                     }
                     bNewPage = false;
                     iTopMargin += iHeaderHeight;
                 }
                 iCount = 0;
                 //Draw Columns Contents
                 foreach (DataGridViewCell Cel in GridRow.Cells)
                 {
                     if (Cel.Value != null)
                     {
                         e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font,
                                     new SolidBrush(Cel.InheritedStyle.ForeColor),
                                     new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin,
                                     (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat);
                     }
                     //Drawing Cells Borders
                     e.Graphics.DrawRectangle(Pens.Black, new Rectangle((int)arrColumnLefts[iCount],
                             iTopMargin, (int)arrColumnWidths[iCount], iCellHeight));

                     iCount++;
                 }
             }
             iRow++;
             iTopMargin += iCellHeight;
         }

         //If more lines exist, print another page.
         if (bMorePagesToPrint)
             e.HasMorePages = true;
         else
             e.HasMorePages = false;
     }
     catch (Exception exc)
     {
         MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
     }
 }
 #endregion


The viewall function fills the dataGridView with the proper data and this works fine. The void aVSRoutingGdToolStripMenuItem_Click functions is called from a menu option and first calls the viewall function to populate the data grid. From there on the code is right from the test program which works. However all I get are blank pages. I have a printDocument1 on my form. I think the printDocument does not know where to get the data from but I can't find out how to make this happen. Any help would be greatly appreciated.

Thanks!
Dave Daley

解决方案

this is not good idea my friend.just read this article.it have a method that you give your datagridview to this method and it print all column you want(Print_DataGridView).try this:

DataGridView Printing by Selecting Columns and Rows[^]


这篇关于使用C#打印DataGridView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆