使用C#打印DataGridView [英] Printing a DataGridView with C#
问题描述
我正在生成一个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屋!