DataGrid有打印功能吗???

fish_kun 2003-10-18 07:53:46
???如何实现
...全文
55 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
snopys 2003-12-28
  • 打赏
  • 举报
回复
to SqlDataAdapter(小鸟)
也给我一份吧,谢谢了!
songweijuan@126.com
huihong 2003-12-25
  • 打赏
  • 举报
回复
能给发一个吗?
hh75428@yahoo.com.cn
chenzhongfei 2003-12-24
  • 打赏
  • 举报
回复
俺也要一个 ymss23@163.com
snakeyin 2003-12-22
  • 打赏
  • 举报
回复
GZ, 好东西
bm1978 2003-12-20
  • 打赏
  • 举报
回复
up
sleeping100 2003-12-20
  • 打赏
  • 举报
回复
SqlDataAdapter(小鸟)

我要一份
zhifu@ecsva.com
googman 2003-10-21
  • 打赏
  • 举报
回复
这是调用的sample
--------------------------------
MyPrint m_print=new MyPrint();
m_print.ReportHeadText="打印测试";
m_print.Print(this.UserDefineDataSource.DefaultView,this.TableStyle,null);
googman 2003-10-21
  • 打赏
  • 举报
回复
续上一贴:
---------------------------------------------------
#region 打印
public class MyPrint:IDisposable
{
#region 系统配置
private DataGridTableStyle m_tabStyle ;

private bool _PaintGrid=true;

private DataView m_dataView;

private int colPos=0;//指示单前列的位置

private int alreadyPrinted=0;//指示已经打印过的行数

private bool alreadyPrintedReportHead=false;//判断是否已经打印过报表头了

private int startColPos=0,startRowPos=0;//分别指示打印时列和行的开始位置

private int rowsSpace=10;//设置行间距

private SolidBrush backBrush;//列头背景色
private Font headFont; //列头字体

private SolidBrush foreBrush; //前景色
private SolidBrush lineBrush;//行分隔线颜色

private Font contentFont; //正文字体
private Font reportHeadFont;//报表标题字体

private string _reportHeadText="查 询 报 表";//报表标题

private int pageNumber=1;//页号

private bool _preventSawtooth=false; //是否防止锯齿效果

private int NotPrintMinDistance=10 ;//如果列的宽度小于这个值,系统将忽略该列的打印
/// <summary>
/// 设置或取得是否防止锯齿效果
/// </summary>
public bool PreventSawtooth
{
set{_preventSawtooth=value;}
get{return _preventSawtooth;}
}

/// <summary>
/// 设置或取得是否打印网格
/// </summary>
public bool PaintGrid
{
set{_PaintGrid=value;}
get{return _PaintGrid;}
}

/// <summary>
/// 设置或取得报表标题
/// </summary>
public string ReportHeadText//
{
set{_reportHeadText=value;}
get{return _reportHeadText;}
}

#endregion

public void Print(DataView View,DataGridTableStyle TabStyle,PageSettings DefaultPageSetup)
{
#region 主进程
m_tabStyle=TabStyle;
m_dataView=View;

backBrush=new SolidBrush(m_tabStyle.HeaderBackColor);//背景色
foreBrush=new SolidBrush(m_tabStyle.ForeColor); //前景色
lineBrush=new SolidBrush(m_tabStyle.GridLineColor);//行分隔线颜色
headFont=new Font("宋体",m_tabStyle.DataGrid.Font.Size+1); //列头字体
contentFont=m_tabStyle.DataGrid.Font; //正文字体

reportHeadFont=new Font("宋体",20,FontStyle.Bold);//报表头字体

PrintDocument pDoc = new PrintDocument();

pDoc.PrintPage+=new PrintPageEventHandler(PrintPage);

PrintPreviewDialog pvDlg=new PrintPreviewDialog();


pvDlg.Document =pDoc;

if (DefaultPageSetup!=null)
pDoc.DefaultPageSettings=DefaultPageSetup;//设置打印页(很重要)


pvDlg.UseAntiAlias=PreventSawtooth ;


try
{
pvDlg.ShowDialog();

}
catch
{
MessageBox.Show("打印时有错误发生","提示",MessageBoxButtons.OK,MessageBoxIcon.Error);
}

if (pDoc!=null) pDoc.Dispose();
if (pvDlg!=null) pvDlg.Dispose();

#endregion

}


private void PrintPage(Object sender , System.Drawing.Printing.PrintPageEventArgs e )
{
int headHeight=headFont.Height*2; //列头的高度

int lx=e.MarginBounds.Left;
int ly=e.MarginBounds.Top;

int width=0;

startColPos=colPos;

#region 打印表头
if (alreadyPrintedReportHead==false)
{

StringFormat format=new StringFormat();
format.Alignment=System.Drawing.StringAlignment.Center;
e.Graphics.DrawString(ReportHeadText,reportHeadFont,foreBrush,(e.MarginBounds.Right-e.MarginBounds.Left)/2+e.MarginBounds.Left,e.MarginBounds.Top/2,format);
format.Dispose();
alreadyPrintedReportHead=true;
}
#endregion

e.Graphics.FillRectangle(backBrush,lx,ly,e.MarginBounds.Width ,headHeight); //打印列头背景

#region 打印列头
while(colPos<m_tabStyle.GridColumnStyles.Count && width+m_tabStyle.GridColumnStyles[colPos].Width<=e.MarginBounds.Width)
{
if (m_tabStyle.GridColumnStyles[colPos].Width>NotPrintMinDistance)
{
SizeF size=e.Graphics.MeasureString(m_tabStyle.GridColumnStyles[colPos].HeaderText,headFont);

if (m_tabStyle.GridColumnStyles[colPos].Width <size.Width )
{
m_tabStyle.GridColumnStyles[colPos].Width =Convert.ToInt32(size.Width);
}

e.Graphics.DrawString(m_tabStyle.GridColumnStyles[colPos].HeaderText,headFont,foreBrush,lx,ly+headFont.Height/2);

width+=m_tabStyle.GridColumnStyles[colPos].Width;
}
else
{

}
lx+=m_tabStyle.GridColumnStyles[colPos].Width;

colPos+=1;
}
#endregion


ly+=headHeight+rowsSpace;

#region 还没打印到列尾的情况

if (colPos<m_tabStyle.GridColumnStyles.Count)
{
this.printRows(e,ref lx,ref ly);
e.HasMorePages=true;

}
#endregion

#region 已经打印到列尾的情况
if (colPos==m_tabStyle.GridColumnStyles.Count)
{

int printedRows=this.printRows(e,ref lx,ref ly);



alreadyPrinted+=printedRows;

if (alreadyPrinted<m_dataView.Count)
{
pageNumber+=1;
e.HasMorePages=true;
colPos=0;
startRowPos+=printedRows;
}
else //已经全部预览完毕,全局数据复位,为打印到打印机做好准备
{
colPos=0;
alreadyPrinted=0;
alreadyPrintedReportHead=false;
startColPos=0;
startRowPos=0;
pageNumber=1;

}
}
#endregion

}

private int printRows(System.Drawing.Printing.PrintPageEventArgs e,ref int lx,ref int ly)
{
#region 打印行
int lines; //每页中需要打印的行数

lines=Convert.ToInt32((e.MarginBounds.Height-headFont.Height)/(contentFont.Height+rowsSpace));

if (m_dataView.Count-alreadyPrinted<lines)
{
lines=m_dataView.Count-alreadyPrinted;
}
else
{
//lines为最多可打印的行数
}

for (int rows=startRowPos;rows<startRowPos+lines;rows++)//打印行循环
{
lx=e.MarginBounds.Left;
for(int i=startColPos;i<colPos;i++)//打印列循环
{

string columnName=m_tabStyle.GridColumnStyles[i].MappingName ;

string contentString;
object obj=m_dataView[rows][columnName];
switch(obj.GetType().ToString())
{
case "System.Boolean":
contentString=(Convert.ToBoolean(m_dataView[rows][columnName])?"YES":"NO");
break;
default:
contentString=m_dataView[rows][columnName].ToString();
break;

}

int contentWidth=Convert.ToInt32(e.Graphics.MeasureString(contentString,contentFont).Width);
int columnHeadWidth=m_tabStyle.GridColumnStyles[i].Width ;
if (columnHeadWidth<=NotPrintMinDistance)
continue;
if (contentWidth>columnHeadWidth)//避免重叠打印算法
{
int subLength=contentString.Length-Convert.ToInt32((contentWidth-columnHeadWidth)/(contentWidth/contentString.Length));
contentString=contentString.Substring(0,subLength) ;
}

if (contentString==string.Empty )
contentString="空";
e.Graphics.DrawString(contentString ,contentFont ,foreBrush,lx,ly);


lx+=m_tabStyle.GridColumnStyles[i].Width;
}
if (PaintGrid) //判断是否需要画行分割线
e.Graphics.DrawLine(new Pen(lineBrush),new Point(e.MarginBounds.Left ,ly+contentFont.Height+2 ),new Point(e.MarginBounds.Right ,ly+contentFont.Height+2));
ly+=contentFont.Height+rowsSpace;
}

#region 打印页码

string page="第 " + pageNumber.ToString()+" 页 打印日期 " + DateTime.Now.ToString("yy-MM-dd");

StringFormat format=new StringFormat();
format.Alignment=System.Drawing.StringAlignment.Center;

e.Graphics.DrawString(page,contentFont,foreBrush,e.MarginBounds.Left+(e.MarginBounds.Right-e.MarginBounds.Left)/2,e.MarginBounds.Bottom+(e.PageBounds.Height-e.MarginBounds.Bottom)/2 ,format);
format.Dispose();

#endregion

return lines;
#endregion
}


public virtual void Dispose()
{

#region 释放
foreBrush.Dispose();
backBrush.Dispose();
lineBrush.Dispose();
reportHeadFont.Dispose();
#endregion

GC.SuppressFinalize(true);
}

}

#endregion
googman 2003-10-21
  • 打赏
  • 举报
回复
以下是源代码,写的糟糕之处请大家见谅.
------------------------------------------------------------------
#region 打印设置
public class PageSetup
{
public static PageSettings Setup()
{
PageSettings DefaultPageSetup=new PageSettings();
PageSettings NewPageSetup=new PageSettings();
try
{

using(PageSetupDialog psDlg=new PageSetupDialog())
{


psDlg.PageSettings=NewPageSetup;

NewPageSetup.Margins=new Margins(200,200,200,300);


if (psDlg.ShowDialog()==DialogResult.OK)
return NewPageSetup;
else
return DefaultPageSetup;


}
}
catch
{
MessageBox.Show("试图设置打印页时发生错误","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
return DefaultPageSetup;
}
}

}
#endregion


mingyuebin 2003-10-20
  • 打赏
  • 举报
回复
小鸟,给我发一份,我的信箱shaobinwang@msn.com,谢了
szc4315 2003-10-20
  • 打赏
  • 举报
回复
小鸟,给我发一份,我的信箱4315@63.net,谢了
Montaque 2003-10-20
  • 打赏
  • 举报
回复
呵呵,组建单的办法直接 InvokePaint,比如:
此示例打印 DataGrid 控件。

示例
Private Sub PrintGrid_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles PrintGrid.Click
PrintDocument1.Print()
End Sub

Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, _
ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _
PrintDocument1.PrintPage
Dim myPaintArgs As New PaintEventArgs(e.Graphics, New Rectangle(New _
Point(0, 0), Me.Size))
Me.InvokePaint(DataGrid1, myPaintArgs)
End Sub
编译代码
此示例需要:

该窗体上名为 PrintGrid 的 Button 控件。
名为 DataGrid1 的 DataGrid 控件。
名为 PrintDocument1 的 PrintDocument 组件。
可靠编程
以下条件可能会导致异常:

您没有访问该打印机的权限。
没有安装打印机。
安全性
为了运行此示例,您必须具有访问打印机的权限。
或者自己处理print事件,包伙格式化表格等。
westseason 2003-10-20
  • 打赏
  • 举报
回复
给我也发一个吧?谢谢。
zlgcool@163.com
winhyf 2003-10-20
  • 打赏
  • 举报
回复
也给我一份,谢了!
yuflying@hotmail.com
UCN 2003-10-20
  • 打赏
  • 举报
回复
to SqlDataAdapter(小鸟)
也给我一份吧,谢谢了!
zuohui127@tom.com
wgsmx 2003-10-20
  • 打赏
  • 举报
回复
to SqlDataAdapter(小鸟)
也给我一份吧,谢谢了!
kp_w@163.com
lanbaibai 2003-10-20
  • 打赏
  • 举报
回复
我想要,我的邮箱是lanbaibai@163.com
googman 2003-10-20
  • 打赏
  • 举报
回复
我已经写好了,你发个邮件向我要就可以,我把代码和例子都给你
menuvb 2003-10-19
  • 打赏
  • 举报
回复
http://www.aspxcn.com/dotnetdown/show.aspx?id=338 用winform实现打印DataGrid列表的示例(vb.net)
baqiao1211 2003-10-19
  • 打赏
  • 举报
回复
mark
加载更多回复(6)
注意:本3.0版控件过于老旧,该控件最新版本为4.7版,您可以到http://myyouping.download.csdn.net/免费下载,也是完全免费的,没有任何功能及使用时间限制,0积分下载。我将3.0版控件的下载分提为10分,是希望大家使用最新版的控件。 控件特色: 1、超强大的DataGridView打印功能,不光可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印打印DataGridView表格,基本上能完全按DataGridView控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,如果您在使用时调整了列的顺序,刷新打印后就会按调整后的列显示顺序进行打印(这是网上很多DataGridView打印控件没有实现的),基本上做到了所见即所得的打印。 2、强大的文本打印输出功能打印文本时,如果需要,控件会自动换行或换页打印输出。 3、支持同一文档多种版面格式打印(类似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法中指定要使用的页面格式即可,使用非常简单。 4、报表功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 5、打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或都从保存的打印方案文件中读取打印参数。 6、水印功能。根据需要,可以在页面中打印或不打印以半透明空心文字打印水印。 7、特殊文字效果功能。本版控件具有打印浮雕文字、阴影文字、空心文字、块文字的功能,效果非常不错。 8、页眉页脚中既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 9、图像打印输出功能。 本控件包括两个打印组件:DGVprint打印组件与VB2008print打印组件。VB2008Print为通用打印控件(为可视化组件),可以混合打印一个或多个DataGridView表格、DataGrid表格与文字、图片等内容;而DGVprint是以VB2008Print为基础开发的(为非可视化组件),为专用的表格打印控件,可以很方便打印单个DatatGridview、DataGrid、DataTable表格的内容,并提供打印时的可视化设置界面,可设置表格打印方式(普通打印、分栏打印、跨页打印、工资条打印)、标题内容及字体、页眉页脚、选择要打印的表格列、列顺序调整及列格式设置、更改列标题名称等,使用非常方便,功能非常强大。 与本控件的上一个版本2.1版相比,本版控件新增功能如下: VB2008Print打印组件新增功能: 1、多种特效文字打印输出功能,能打印的特效文字有 空心文字、浮雕文字、块文字、阴影文字等。 2、水印打印功能。可以在面页中以半透明空心文字的形式打印背景水印,只需要简单设置控件的WaterMarkText等几个以WaterMark开头的属性即可,程序会自动打印水印。 3、PrintDGV函数可直接使用DGVPrint组件保存的打印方案文件打印输出DataGridView表格, 4、在页眉页脚中不光可以打印文本,还可以打印图像,文本与图像可同时打印(即在图像上显示文本)。此外,页眉页脚文字可以换行打印了,页面的左边也右边距也可以打印内容了(调用相应的函数PrintLeft与PrintRight实现)。 5、改进DrawText函数输出文本的功能,现在,即便调用没有指定打印区域或打印宽度的DrawText函数输出文本,打印输出时控件也会智能换行和换页(原版本是需要指定打印宽度才能自动换行换页打印的) 6、改进DrawImage与DrawCellImage输出图像功能,如果图像比较小(小于打印区域大小),可以不进行放大打印。(但如果图像大于打印区域的话,还是采用整体缩小打印,而不是区域剪裁打印)。 7、增加IsShowPrintStatusDialog属性,指示在发送到打印打印时,是否显示一个指示正在打印的状态窗口(可以取消打印),为TRUE表示要显示,为False表示不显示。 8、改进页眉页脚事件,将原来的HeaderOut与FooterOut统一为HeaderFooterOut事件,在该事件中,您可以调用PrintFooter、PrintHeader、PrintLeft、PrintRight函数分别打印上下左右的页眉。(PrintLeft与PrintRight函数为新增加的,用于在左边与右边页边距处输出内容) DGVPrint打印组件新增功能: 1、打印方案保存与读取功能。本版控件可以将您的可视化设置(包括列格式设置等)全部保存为打印方案文件(文本文件,您可以用记事本打开并修改),并有读取方案文件的功能,不再需要每次都进行打印格式设置了,一劳永逸! 2、直接调用打印方案文件打印功能。您不光可以设计DGVPrint打印组件的属性来进行打印,还可以直接调用DGVPrint组件中保存的打印方案文件,直接利用保存的方案文件的参数进行打印预览输出。 3、新增在可视化打印参数设置界面的列标题重命名功能,可能修改列标题要打印的名字。 4、水印打印功能。如果水印文本设置为空,则不打印水印。 5、导出数据成Excel功能。暂未提供该功能的函数接口,只在打印参数设置窗口中增加了一个数据导出的按钮,可以将当前要打印DataGridView的内容导出成Excel文件。该功能以后会进一步完善。 6、在进行页眉页脚文本设置时,可以用 [页码] 代表要输出的当前页码,用 [总页数] 代表要输出总页数,控件在进行输出时,会自动将其转换为对应的页码与文档总页数。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧