在msdn中有一篇文章:演练:使用 LocalReport 对象进行打印 (C#)。我在测试过程中发现两个问题:1、每次打印完毕在指定报表的位置自动创建的图片不会自动清除;2、没有办法在程序中指定打印机的纸张规格(PageSize)。我想了很久,测试了很多次,始终解决不了,请高手指点迷津。谢谢!
下面是代码:
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;public class Demo : IDisposable
{
private int m_currentPageIndex;
private IList<Stream> m_streams; private DataTable LoadSalesData()
{
DataSet dataSet = new DataSet();
dataSet.ReadXml(@"c:\My Reports\data.xml");
return dataSet.Tables[0];
} private Stream CreateStream(string name,
string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
Stream stream = new FileStream(@"c:\My Reports\" + name +
"." + fileNameExtension, FileMode.Create);
m_streams.Add(stream);
return stream;
} private void Export(LocalReport report)
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.25in</MarginTop>" +
" <MarginLeft>0.25in</MarginLeft>" +
" <MarginRight>0.25in</MarginRight>" +
" <MarginBottom>0.25in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams)
stream.Position = 0;
} private void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
ev.Graphics.DrawImage(pageImage, ev.PageBounds); m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
} private void Print()
{
const string printerName = "Microsoft Office Document Image Writer"; if (m_streams == null || m_streams.Count == 0)
return; PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings.PrinterName = printerName;
if (!printDoc.PrinterSettings.IsValid)
{
string msg = String.Format("Can't find printer \"{0}\".", printerName);
MessageBox.Show(msg, "Print Error");
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.Print();
} private void Run()
{
LocalReport report = new LocalReport();
report.ReportPath = @"c:\My Reports\Report.rdlc";
report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData())); Export(report); m_currentPageIndex = 0;
Print();
} public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
} public static void Main(string[] args)
{
using (Demo demo = new Demo())
{
demo.Run();
}
}
}
下面是代码:
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using System.Windows.Forms;
using Microsoft.Reporting.WinForms;public class Demo : IDisposable
{
private int m_currentPageIndex;
private IList<Stream> m_streams; private DataTable LoadSalesData()
{
DataSet dataSet = new DataSet();
dataSet.ReadXml(@"c:\My Reports\data.xml");
return dataSet.Tables[0];
} private Stream CreateStream(string name,
string fileNameExtension, Encoding encoding,
string mimeType, bool willSeek)
{
Stream stream = new FileStream(@"c:\My Reports\" + name +
"." + fileNameExtension, FileMode.Create);
m_streams.Add(stream);
return stream;
} private void Export(LocalReport report)
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.25in</MarginTop>" +
" <MarginLeft>0.25in</MarginLeft>" +
" <MarginRight>0.25in</MarginRight>" +
" <MarginBottom>0.25in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream, out warnings); foreach (Stream stream in m_streams)
stream.Position = 0;
} private void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
ev.Graphics.DrawImage(pageImage, ev.PageBounds); m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
} private void Print()
{
const string printerName = "Microsoft Office Document Image Writer"; if (m_streams == null || m_streams.Count == 0)
return; PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings.PrinterName = printerName;
if (!printDoc.PrinterSettings.IsValid)
{
string msg = String.Format("Can't find printer \"{0}\".", printerName);
MessageBox.Show(msg, "Print Error");
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.Print();
} private void Run()
{
LocalReport report = new LocalReport();
report.ReportPath = @"c:\My Reports\Report.rdlc";
report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData())); Export(report); m_currentPageIndex = 0;
Print();
} public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
} public static void Main(string[] args)
{
using (Demo demo = new Demo())
{
demo.Run();
}
}
}
解决方案 »
- WPF鼠标放上去效果
- C#调用ControlCAN.dll为何只能取第1笔数据??
- C# 图片相关问题
- C#调用dll,如果dll不存在的问题
- 如果判断代码页的单或双字节编码?
- 请问在.net中如何调pdf的编程接口
- Windows窗体,能否设置DataGrid列中的每个单元格为DateTimePicker控件?
- 如何判断读取文本的一行都是空呢?
- web form 如何实现这种取消操作?
- 大家都听什么歌啊?贴一个最喜欢听的上来,我发到我的Blog上!
- c#winform:Webrequest超诡异问题~~~~~~~高手们,帮忙解决一下!!!
- webform和winform的事件处理函数默认访问为什么不同 protected 和 Private
PrintDocument pd = new PrintDocument();
pd.DefaultPageSettings.PaperSize = new PaperSize(nWidth, nHeight);