DataGrid有打印功能吗???

fish_kun 2003-10-18 07:53:46
???如何实现
...全文
54 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)

16,553

社区成员

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

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