C# 如何从 DataGridView 控件打印值
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15853746/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to print values from a DataGridView control
提问by bandaa
I have an application that has a DataGridView
control, which holds data that I want to print out when the "print" button is pushed.
我有一个具有DataGridView
控件的应用程序,该控件保存了按下“打印”按钮时要打印的数据。
So far I have got the "print" button working, but when I print on the application the page comes out blank!
到目前为止,我已经让“打印”按钮正常工作,但是当我在应用程序上打印时,页面显示为空白!
How do I edit my code to enable the data to be printed?
如何编辑我的代码以允许打印数据?
public partial class frmViewBookings : Form
{
private void btnClose_Click(object sender, EventArgs e)
{
Form3 mainpage = new Form3();
mainpage.Show();
this.Close();
}
private void frmViewBookings_Load(object sender, EventArgs e)
{
this.bookingTableAdapter.Fill(this.usersDataSet1.Booking);
}
private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
{
var myPaintArgs = new PaintEventArgs
(
e.Graphics,
new Rectangle(new Point(0, 0), this.Size)
);
this.InvokePaint(dataGridView1, myPaintArgs);
}
private void btnPrint_Click(object sender, EventArgs e)
{
printDocument1.Print();
}
}
回答by KF2
I previously Test this class for Print data grid view
content
我以前测试这个类的打印data grid view
内容
Add this class to your project:
将此类添加到您的项目中:
class ClsPrint
{
#region Variables
int iCellHeight = 0; //Used to get/set the datagridview cell height
int iTotalWidth = 0; //
int iRow = 0;//Used as counter
bool bFirstPage = false; //Used to check whether we are printing first page
bool bNewPage = false;// Used to check whether we are printing a new page
int iHeaderHeight = 0; //Used for the header height
StringFormat strFormat; //Used to format the grid rows.
ArrayList arrColumnLefts = new ArrayList();//Used to save left coordinates of columns
ArrayList arrColumnWidths = new ArrayList();//Used to save column widths
private PrintDocument _printDocument = new PrintDocument();
private DataGridView gw = new DataGridView();
private string _ReportHeader;
#endregion
public ClsPrint(DataGridView gridview, string ReportHeader)
{
_printDocument.PrintPage += new PrintPageEventHandler(_printDocument_PrintPage);
_printDocument.BeginPrint += new PrintEventHandler(_printDocument_BeginPrint);
gw = gridview;
_ReportHeader = ReportHeader;
}
public void PrintForm()
{
////Open the print dialog
//PrintDialog printDialog = new PrintDialog();
//printDialog.Document = _printDocument;
//printDialog.UseEXDialog = true;
////Get the document
//if (DialogResult.OK == printDialog.ShowDialog())
//{
// _printDocument.DocumentName = "Test Page Print";
// _printDocument.Print();
//}
//Open the print preview dialog
PrintPreviewDialog objPPdialog = new PrintPreviewDialog();
objPPdialog.Document = _printDocument;
objPPdialog.ShowDialog();
}
private void _printDocument_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 gw.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 headers
arrColumnLefts.Add(iLeftMargin);
arrColumnWidths.Add(iTmpWidth);
iLeftMargin += iTmpWidth;
}
}
//Loop till all the grid rows not get printed
while (iRow <= gw.Rows.Count - 1)
{
DataGridViewRow GridRow = gw.Rows[iRow];
//Set the cell height
iCellHeight = GridRow.Height + 5;
int iCount = 0;
//Check whether the current page settings allows 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(_ReportHeader,
new Font(gw.Font, FontStyle.Bold),
Brushes.Black, e.MarginBounds.Left,
e.MarginBounds.Top - e.Graphics.MeasureString(_ReportHeader,
new Font(gw.Font, FontStyle.Bold),
e.MarginBounds.Width).Height - 13);
String strDate = "";
//Draw Date
e.Graphics.DrawString(strDate,
new Font(gw.Font, FontStyle.Bold), Brushes.Black,
e.MarginBounds.Left +
(e.MarginBounds.Width - e.Graphics.MeasureString(strDate,
new Font(gw.Font, FontStyle.Bold),
e.MarginBounds.Width).Width),
e.MarginBounds.Top - e.Graphics.MeasureString(_ReportHeader,
new Font(new Font(gw.Font, FontStyle.Bold),
FontStyle.Bold), e.MarginBounds.Width).Height - 13);
//Draw Columns
iTopMargin = e.MarginBounds.Top;
DataGridViewColumn[] _GridCol = new DataGridViewColumn[gw.Columns.Count];
int colcount = 0;
//Convert ltr to rtl
foreach (DataGridViewColumn GridCol in gw.Columns)
{
_GridCol[colcount++] = GridCol;
}
for (int i = (_GridCol.Count() - 1); i >= 0; i--)
{
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[i].HeaderText,
_GridCol[i].InheritedStyle.Font,
new SolidBrush(_GridCol[i].InheritedStyle.ForeColor),
new RectangleF((int)arrColumnLefts[iCount], iTopMargin,
(int)arrColumnWidths[iCount], iHeaderHeight), strFormat);
iCount++;
}
bNewPage = false;
iTopMargin += iHeaderHeight;
}
iCount = 0;
DataGridViewCell[] _GridCell = new DataGridViewCell[GridRow.Cells.Count];
int cellcount = 0;
//Convert ltr to rtl
foreach (DataGridViewCell Cel in GridRow.Cells)
{
_GridCell[cellcount++] = Cel;
}
//Draw Columns Contents
for (int i = (_GridCell.Count() - 1); i >= 0; i--)
{
if (_GridCell[i].Value != null)
{
e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(),
_GridCell[i].InheritedStyle.Font,
new SolidBrush(_GridCell[i].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);
//}
}
private void _printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
try
{
strFormat = new StringFormat();
strFormat.Alignment = StringAlignment.Center;
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 gw.Columns)
{
iTotalWidth += dgvGridCol.Width;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
For using:this will show print dialog with grid view result
使用:这将显示带有网格视图结果的打印对话框
ClsPrint _ClsPrint = new ClsPrint(dataGridView1, "header doc text");
_ClsPrint.PrintForm();
Result
结果
Further information and full example proejct
EDIT
编辑
To get columns in right order (rather than having them in reversed order), do this:
要以正确的顺序获取列(而不是以相反的顺序排列),请执行以下操作:
int colcount = gw.Columns.Count - 1;
//Convert ltr to rtl
foreach (DataGridViewColumn GridCol in gw.Columns)
{
_GridCol[colcount--] = GridCol;
}
and
和
int cellcount = GridRow.Cells.Count - 1;
//Convert ltr to rtl
foreach (DataGridViewCell Cel in GridRow.Cells)
{
_GridCell[cellcount--] = Cel;
}
回答by Johnathan Tang
When using IRSOG's code, change the direction of the loops below Convert ltr to rtl for regular results. Otherwise the whole dgv would be flipped.
使用 IRSOG 的代码时,更改以下循环的方向将 ltr 转换为 rtl 以获得常规结果。否则整个 dgv 将被翻转。
回答by baban jamal
- Open Visual Studio 2010.
- Create new project and give appropriate name.
- Drag and drop datagridview in your form from toolbox.
- Add data in the datagridview.
- Drag and drop the printDocument from toolbox.
- Add a button for print on the form.
- Double click to get the click event of button.
- Write the below code in print button click event. printDocument1.Print();
- Double click on the printDocument to get the Print Page event.
Write the below code for print the datagridview:-
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height); dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height)); e.Graphics.DrawImage(bm, 0, 0); }
- 打开 Visual Studio 2010。
- 创建新项目并给出适当的名称。
- 从工具箱中将 datagridview 拖放到您的表单中。
- 在数据网格视图中添加数据。
- 从工具箱中拖放 printDocument。
- 在表单上添加打印按钮。
- 双击获取按钮的点击事件。
- 在打印按钮单击事件中编写以下代码。printDocument1.Print();
- 双击 printDocument 以获取 Print Page 事件。
编写以下代码以打印数据网格视图:-
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height); dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height)); e.Graphics.DrawImage(bm, 0, 0); }
source https://www.mindstick.com/Articles/1356/datagridview-printing-in-c-sharp
来源 https://www.mindstick.com/Articles/1356/datagridview-printing-in-c-sharp
this will work exactly
这将完全有效