RDLC报表(七)

来源:互联网 发布:apache ftpclient api 编辑:程序博客网 时间:2024/06/05 22:50
 有关LocalReport、DeviceInfo和PrintDocument的内容已经介绍得差不多了,稍后会给出一个继承自System.Drawing.Printing.PrintDocument的组件EMFStreamPrintDocument。但是现在,来看一下如何进行自定义纸张票据打印时的页面设置。页面设置窗体如下图所示:

RDLC报表(七) - 了啦 - 了啦的博客

如何添加、删除自定义大小的纸张、枚举系统的打印机?以前在博客园的一篇随笔中参加过讨论,见http://wormday.cnblogs.com/archive/2005/12/22/302635.aspx。当然还是使用Win32 API,以下是我封装的一个关于打印机控制的类[以前用VB实现过比这个类还要多的关于打印机控制的功能,但是在C#中感到还是挺困难的,所以这次只给出了够用的功能:获取当前指定打印机的状态、删除已经存在的自定义纸张、指定的打印机设置以mm为单位的自定义纸张(Form)、获取本地打印机列表、获取本机的默认打印机名称、设置默认打印机、判断打印机是否在系统可用的打印机列表中、判断表单是否在指定的打印机所支持的纸张列表中、判断指定纸张的宽度和高度和在文本框中指定的宽度和高度是否匹配、英尺到厘米的转换]:

RDLC报表(七) - 了啦 - 了啦的博客using System;
RDLC报表(七) - 了啦 - 了啦的博客
using System.Text;
RDLC报表(七) - 了啦 - 了啦的博客
using System.Runtime.InteropServices;
RDLC报表(七) - 了啦 - 了啦的博客
using System.Security;
RDLC报表(七) - 了啦 - 了啦的博客
using System.ComponentModel;
RDLC报表(七) - 了啦 - 了啦的博客
using System.Drawing.Printing;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
namespace RDLCReport
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
public class Printer
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
private Printer()
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
API声明
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
internal static int GetPrinterStatusInt(string PrinterName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
int intRet = 0;
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr hPrinter;
RDLC报表(七) - 了啦 - 了啦的博客 structPrinterDefaults defaults
= new structPrinterDefaults();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (OpenPrinter(PrinterName, out hPrinter, ref defaults))
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
int cbNeeded = 0;
RDLC报表(七) - 了啦 - 了啦的博客
bool bolRet = GetPrinter(hPrinter, 2, IntPtr.Zero, 0, out cbNeeded);
RDLC报表(七) - 了啦 - 了啦的博客
if (cbNeeded > 0)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr pAddr
= Marshal.AllocHGlobal((int)cbNeeded);
RDLC报表(七) - 了啦 - 了啦的博客 bolRet
= GetPrinter(hPrinter, 2, pAddr, cbNeeded, out cbNeeded);
RDLC报表(七) - 了啦 - 了啦的博客
if (bolRet)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 PRINTER_INFO_2 Info2
= new PRINTER_INFO_2();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 Info2
= (PRINTER_INFO_2)Marshal.PtrToStructure(pAddr, typeof(PRINTER_INFO_2));
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 intRet
= System.Convert.ToInt32(Info2.Status);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 Marshal.FreeHGlobal(pAddr);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 ClosePrinter(hPrinter);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
return intRet;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
internal static PRINTER_INFO_2[] EnumPrintersByFlag(PrinterEnumFlags Flags)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
uint cbNeeded = 0;
RDLC报表(七) - 了啦 - 了啦的博客
uint cReturned = 0;
RDLC报表(七) - 了啦 - 了啦的博客
bool ret = EnumPrinters( PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, 2, IntPtr.Zero, 0, ref cbNeeded, ref cReturned);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr pAddr
= Marshal.AllocHGlobal((int)cbNeeded);
RDLC报表(七) - 了啦 - 了啦的博客 ret
= EnumPrinters(PrinterEnumFlags.PRINTER_ENUM_LOCAL, null, 2, pAddr, cbNeeded, ref cbNeeded, ref cReturned);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (ret)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 PRINTER_INFO_2[] Info2
= new PRINTER_INFO_2[cReturned];
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
int offset = pAddr.ToInt32();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
for (int i = 0; i < cReturned; i++)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pServerName
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pPrinterName
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pShareName
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pPortName
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pDriverName
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pComment
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pLocation
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pDevMode
= Marshal.ReadIntPtr(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pSepFile
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pPrintProcessor
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pDatatype
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pParameters
= Marshal.PtrToStringAuto(Marshal.ReadIntPtr(new IntPtr(offset)));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].pSecurityDescriptor
= Marshal.ReadIntPtr(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].Attributes
= (uint )Marshal.ReadIntPtr(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].Priority
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].DefaultPriority
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].StartTime
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].UntilTime
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].Status
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].cJobs
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客 Info2[i].AveragePPM
= (uint)Marshal.ReadInt32(new IntPtr(offset));
RDLC报表(七) - 了啦 - 了啦的博客 offset
+= 4;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 Marshal.FreeHGlobal(pAddr);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
return Info2;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
else
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
return new PRINTER_INFO_2[0];
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 获取当前指定打印机的状态
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PrinterName">打印机名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <returns>打印机状态描述</returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static string GetPrinterStatus(string PrinterName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
int intValue = GetPrinterStatusInt(PrinterName);
RDLC报表(七) - 了啦 - 了啦的博客
string strRet = string.Empty;
RDLC报表(七) - 了啦 - 了啦的博客
switch (intValue)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
case 0:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "准备就绪(Ready)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000200:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "忙(Busy)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00400000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "门被打开(Printer Door Open)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000002:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "错误(Printer Error)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x0008000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "正在初始化(Initializing)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000100:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "正在输入或输出(I/O Active)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000020:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "手工送纸(Manual Feed)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00040000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "无墨粉(No Toner)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00001000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "不可用(Not Available)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000080:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "脱机(Off Line)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00200000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "内存溢出(Out of Memory)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000800:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "输出口已满(Output Bin Full)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00080000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "当前页无法打印(Page Punt)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000008:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "塞纸(Paper Jam)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000010:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "打印纸用完(Paper Out)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000040:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "纸张问题(Page Problem)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000001:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "暂停(Paused)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000004:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "正在删除(Pending Deletion)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00000400:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "正在打印(Printing)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00004000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "正在处理(Processing)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00020000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "墨粉不足(Toner Low)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00100000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "需要用户干预(User Intervention)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x20000000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "等待(Waiting)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
case 0x00010000:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "正在准备(Warming Up)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客
default:
RDLC报表(七) - 了啦 - 了啦的博客 strRet
= "未知状态(Unknown Status)";
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
return strRet;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 删除已经存在的自定义纸张
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PrinterName">打印机名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PaperName">纸张名称</param>

RDLC报表(七) - 了啦 - 了啦的博客 public static void DeleteCustomPaperSize(string PrinterName, string PaperName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
const int PRINTER_ACCESS_USE = 0x00000008;
RDLC报表(七) - 了啦 - 了啦的博客
const int PRINTER_ACCESS_ADMINISTER = 0x00000004;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 structPrinterDefaults defaults
= new structPrinterDefaults();
RDLC报表(七) - 了啦 - 了啦的博客 defaults.pDatatype
= null;
RDLC报表(七) - 了啦 - 了啦的博客 defaults.pDevMode
= IntPtr.Zero;
RDLC报表(七) - 了啦 - 了啦的博客 defaults.DesiredAccess
= PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr hPrinter
= IntPtr.Zero;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//打开打印机
RDLC报表(七) - 了啦 - 了啦的博客
if (OpenPrinter(PrinterName, out hPrinter, ref defaults))
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
try
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 DeleteForm(hPrinter, PaperName);
RDLC报表(七) - 了啦 - 了啦的博客 ClosePrinter(hPrinter);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
catch
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 Pub.WinForm.Msg.Warning(
"删除自定义纸张时发生错误!");
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 指定的打印机设置以mm为单位的自定义纸张(Form)
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PrinterName">打印机名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PaperName">Form名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="WidthInMm">以mm为单位的宽度</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="HeightInMm">以mm为单位的高度</param>

RDLC报表(七) - 了啦 - 了啦的博客 public static void AddCustomPaperSize(string PrinterName, string PaperName, float WidthInMm, float HeightInMm)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
if (PlatformID.Win32NT == Environment.OSVersion.Platform)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
const int PRINTER_ACCESS_USE = 0x00000008;
RDLC报表(七) - 了啦 - 了啦的博客
const int PRINTER_ACCESS_ADMINISTER = 0x00000004;
RDLC报表(七) - 了啦 - 了啦的博客
const int FORM_PRINTER = 0x00000002;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 structPrinterDefaults defaults
= new structPrinterDefaults();
RDLC报表(七) - 了啦 - 了啦的博客 defaults.pDatatype
= null;
RDLC报表(七) - 了啦 - 了啦的博客 defaults.pDevMode
= IntPtr.Zero;
RDLC报表(七) - 了啦 - 了啦的博客 defaults.DesiredAccess
= PRINTER_ACCESS_ADMINISTER | PRINTER_ACCESS_USE;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr hPrinter
= IntPtr.Zero;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//打开打印机
RDLC报表(七) - 了啦 - 了啦的博客
if (OpenPrinter(PrinterName, out hPrinter, ref defaults))
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
try
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
//如果Form存在删除之
RDLC报表(七) - 了啦 - 了啦的博客
DeleteForm(hPrinter, PaperName);
RDLC报表(七) - 了啦 - 了啦的博客
//创建并初始化FORM_INFO_1
RDLC报表(七) - 了啦 - 了啦的博客
FormInfo1 formInfo = new FormInfo1();
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.Flags
= 0;
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.pName
= PaperName;
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.Size.width
= (int)(WidthInMm * 1000.0);
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.Size.height
= (int)(HeightInMm * 1000.0);
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.ImageableArea.left
= 0;
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.ImageableArea.right
= formInfo.Size.width;
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.ImageableArea.top
= 0;
RDLC报表(七) - 了啦 - 了啦的博客 formInfo.ImageableArea.bottom
= formInfo.Size.height;
RDLC报表(七) - 了啦 - 了啦的博客
if (!AddForm(hPrinter, 1, ref formInfo))
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 StringBuilder strBuilder
= new StringBuilder();
RDLC报表(七) - 了啦 - 了啦的博客 strBuilder.AppendFormat(
"向打印机 {1} 添加自定义纸张 {0} 失败!错误代号:{2}",
RDLC报表(七) - 了啦 - 了啦的博客 PaperName, PrinterName, GetLastError());
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException(strBuilder.ToString());
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//初始化
RDLC报表(七) - 了啦 - 了啦的博客
const int DM_OUT_BUFFER = 2;
RDLC报表(七) - 了啦 - 了啦的博客
const int DM_IN_BUFFER = 8;
RDLC报表(七) - 了啦 - 了啦的博客 structDevMode devMode
= new structDevMode();
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr hPrinterInfo, hDummy;
RDLC报表(七) - 了啦 - 了啦的博客 PRINTER_INFO_9 printerInfo;
RDLC报表(七) - 了啦 - 了啦的博客 printerInfo.pDevMode
= IntPtr.Zero;
RDLC报表(七) - 了啦 - 了啦的博客
int iPrinterInfoSize, iDummyInt;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
int iDevModeSize = DocumentProperties(IntPtr.Zero, hPrinter, PrinterName, IntPtr.Zero, IntPtr.Zero, 0);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (iDevModeSize < 0)
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException("无法取得DEVMODE结构的大小!");
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//分配缓冲
RDLC报表(七) - 了啦 - 了啦的博客
IntPtr hDevMode = Marshal.AllocCoTaskMem(iDevModeSize + 100);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//获取DEV_MODE指针
RDLC报表(七) - 了啦 - 了啦的博客
int iRet = DocumentProperties(IntPtr.Zero, hPrinter, PrinterName, hDevMode, IntPtr.Zero, DM_OUT_BUFFER);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (iRet < 0)
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException("无法获得DEVMODE结构!");
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//填充DEV_MODE
RDLC报表(七) - 了啦 - 了啦的博客
devMode = (structDevMode)Marshal.PtrToStructure(hDevMode, devMode.GetType());
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 devMode.dmFields
= 0x10000;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
//FORM名称
RDLC报表(七) - 了啦 - 了啦的博客
devMode.dmFormName = PaperName;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 Marshal.StructureToPtr(devMode, hDevMode,
true);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 iRet
= DocumentProperties(IntPtr.Zero, hPrinter, PrinterName,
RDLC报表(七) - 了啦 - 了啦的博客 printerInfo.pDevMode, printerInfo.pDevMode, DM_IN_BUFFER
| DM_OUT_BUFFER);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (iRet < 0)
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException("无法为打印机设定打印方向!");
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 GetPrinter(hPrinter,
9, IntPtr.Zero, 0, out iPrinterInfoSize);
RDLC报表(七) - 了啦 - 了啦的博客
if (iPrinterInfoSize == 0)
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException("调用GetPrinter方法失败!");
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 hPrinterInfo
= Marshal.AllocCoTaskMem(iPrinterInfoSize + 100);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
bool bSuccess = GetPrinter(hPrinter, 9, hPrinterInfo, iPrinterInfoSize, out iDummyInt);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (!bSuccess)
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException("调用GetPrinter方法失败!");
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 printerInfo
= (PRINTER_INFO_9)Marshal.PtrToStructure(hPrinterInfo, printerInfo.GetType());
RDLC报表(七) - 了啦 - 了啦的博客 printerInfo.pDevMode
= hDevMode;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 Marshal.StructureToPtr(printerInfo, hPrinterInfo,
true);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 bSuccess
= SetPrinter(hPrinter, 9, hPrinterInfo, 0);
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
if (!bSuccess)
RDLC报表(七) - 了啦 - 了啦的博客
throw new Win32Exception(Marshal.GetLastWin32Error(), "调用SetPrinter方法失败,无法进行打印机设置!");
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 SendMessageTimeout(
RDLC报表(七) - 了啦 - 了啦的博客
new IntPtr(HWND_BROADCAST),
RDLC报表(七) - 了啦 - 了啦的博客 WM_SETTINGCHANGE,
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr.Zero,
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr.Zero,
RDLC报表(七) - 了啦 - 了啦的博客 Printer.SendMessageTimeoutFlags.SMTO_NORMAL,
RDLC报表(七) - 了啦 - 了啦的博客
1000,
RDLC报表(七) - 了啦 - 了啦的博客
out hDummy);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
finally
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 ClosePrinter(hPrinter);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
else
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 StringBuilder strBuilder
= new StringBuilder();
RDLC报表(七) - 了啦 - 了啦的博客 strBuilder.AppendFormat(
"无法打开打印机{0}, 错误代号: {1}",
RDLC报表(七) - 了啦 - 了啦的博客 PrinterName, GetLastError());
RDLC报表(七) - 了啦 - 了啦的博客
throw new ApplicationException(strBuilder.ToString());
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
else
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 structDevMode pDevMode
= new structDevMode();
RDLC报表(七) - 了啦 - 了啦的博客 IntPtr hDC
= CreateDC(null, PrinterName, null, ref pDevMode);
RDLC报表(七) - 了啦 - 了啦的博客
if (hDC != IntPtr.Zero)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
const long DM_PAPERSIZE = 0x00000002L;
RDLC报表(七) - 了啦 - 了啦的博客
const long DM_PAPERLENGTH = 0x00000004L;
RDLC报表(七) - 了啦 - 了啦的博客
const long DM_PAPERWIDTH = 0x00000008L;
RDLC报表(七) - 了啦 - 了啦的博客 pDevMode.dmFields
= (int)(DM_PAPERSIZE | DM_PAPERWIDTH | DM_PAPERLENGTH);
RDLC报表(七) - 了啦 - 了啦的博客 pDevMode.dmPaperSize
= 256;
RDLC报表(七) - 了啦 - 了啦的博客 pDevMode.dmPaperWidth
= (short)(WidthInMm * 1000.0);
RDLC报表(七) - 了啦 - 了啦的博客 pDevMode.dmPaperLength
= (short)(HeightInMm * 1000.0);
RDLC报表(七) - 了啦 - 了啦的博客 ResetDC(hDC,
ref pDevMode);
RDLC报表(七) - 了啦 - 了啦的博客 DeleteDC(hDC);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 获取本地打印机列表
RDLC报表(七) - 了啦 - 了啦的博客
/// 可以通过制定参数获取网络打印机
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <returns>打印机列表</returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static System.Collections.ArrayList GetPrinterList()
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 System.Collections.ArrayList alRet
= new System.Collections.ArrayList();
RDLC报表(七) - 了啦 - 了啦的博客 PRINTER_INFO_2[] Info2
= EnumPrintersByFlag(PrinterEnumFlags.PRINTER_ENUM_LOCAL);
RDLC报表(七) - 了啦 - 了啦的博客
for (int i = 0; i < Info2.Length; i++)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 alRet.Add(Info2[i].pPrinterName);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
return alRet;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 获取本机的默认打印机名称
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <returns>默认打印机名称</returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static string GetDeaultPrinterName()
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 StringBuilder dp
= new StringBuilder(256);
RDLC报表(七) - 了啦 - 了啦的博客
int size = dp.Capacity;
RDLC报表(七) - 了啦 - 了啦的博客
if (GetDefaultPrinter(dp, ref size))
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
return dp.ToString();
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
else
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
int rc = GetLastError();
RDLC报表(七) - 了啦 - 了啦的博客 Pub.WinForm.Msg.Warning(
"获取默认打印机失败!错误代号:" + rc.ToString());
RDLC报表(七) - 了啦 - 了啦的博客
return string.Empty;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 设置默认打印机
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PrinterName">可用的打印机名称</param>

RDLC报表(七) - 了啦 - 了啦的博客 public static void SetPrinterToDefault(string PrinterName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 SetDefaultPrinter(PrinterName);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
///// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
///// 判断打印机是否在系统可用的打印机列表中
RDLC报表(七) - 了啦 - 了啦的博客
///// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
///// <param name="PrinterName">打印机名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
///// <returns>是:在;否:不在</returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static bool PrinterInList(string PrinterName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
bool bolRet = false;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 System.Collections.ArrayList alPrinters
= GetPrinterList();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
for (int i = 0; i < alPrinters.Count; i++)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
if (PrinterName == alPrinters[i].ToString())
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 bolRet
= true;
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 alPrinters.Clear();
RDLC报表(七) - 了啦 - 了啦的博客 alPrinters
= null;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
return bolRet;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
///// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
///// 判断表单是否在指定的打印机所支持的纸张列表中
RDLC报表(七) - 了啦 - 了啦的博客
///// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
///// <param name="PrinterName">打印机名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
///// <param name="PaperName">纸张名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
///// <returns>是:在;否:不在</returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static bool FormInPrinter(string PrinterName, string PaperName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
bool bolRet = false;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 System.Drawing.Printing.PrintDocument pd
= new System.Drawing.Printing.PrintDocument();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 pd.PrinterSettings.PrinterName
= PrinterName;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
foreach (System.Drawing.Printing.PaperSize ps in pd.PrinterSettings.PaperSizes)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
if (ps.PaperName == PaperName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客 bolRet
= true;
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 pd.Dispose();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
return bolRet;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 判断指定纸张的宽度和高度和在文本框中指定的宽度和高度是否匹配
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="PrinterName">打印机名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="FormName">表单名称</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="Width">宽度</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="Height">高度</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <returns></returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static bool FormSameSize(string PrinterName, string FormName, decimal Width, decimal Height)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
bool bolRet = false;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 System.Drawing.Printing.PrintDocument pd
= new System.Drawing.Printing.PrintDocument();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 pd.PrinterSettings.PrinterName
= PrinterName;
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
foreach (System.Drawing.Printing.PaperSize ps in pd.PrinterSettings.PaperSizes)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
if (ps.PaperName == FormName)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
decimal decWidth = FromInchToCM(System.Convert.ToDecimal(ps.Width));
RDLC报表(七) - 了啦 - 了啦的博客
decimal decHeight = FromInchToCM(System.Convert.ToDecimal(ps.Height));
RDLC报表(七) - 了啦 - 了啦的博客
//只要整数位相同即认为是同一纸张,毕竟inch到cm的转换并不能整除
RDLC报表(七) - 了啦 - 了啦的博客
if (Pub.MathEx.Round(decWidth, 0) == Pub.MathEx.Round(Width, 0) && Pub.MathEx.Round(decHeight, 0) == Pub.MathEx.Round(Height, 0))
RDLC报表(七) - 了啦 - 了啦的博客 bolRet
= true;
RDLC报表(七) - 了啦 - 了啦的博客
break;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客 pd.Dispose();
RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
return bolRet;
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客
RDLC报表(七) - 了啦 - 了啦的博客
/// <summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// 英尺到厘米的转换
RDLC报表(七) - 了啦 - 了啦的博客
/// 米国人用的是英尺,中国人用的是厘米
RDLC报表(七) - 了啦 - 了啦的博客
/// 1 inch = 2.5400 cm
RDLC报表(七) - 了啦 - 了啦的博客
/// </summary>
RDLC报表(七) - 了啦 - 了啦的博客
/// <param name="inch">英尺数</param>
RDLC报表(七) - 了啦 - 了啦的博客
/// <returns>厘米数,两位小数</returns>

RDLC报表(七) - 了啦 - 了啦的博客 public static decimal FromInchToCM(decimal inch)
RDLC报表(七) - 了啦 - 了啦的博客
{
RDLC报表(七) - 了啦 - 了啦的博客
return Math.Round((System.Convert.ToDecimal((inch / 100)) * System.Convert.ToDecimal(2.5400)), 2);
RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客 }

RDLC报表(七) - 了啦 - 了啦的博客}

页面设置窗体由报表浏览器窗体ReportViewer调用,使用以下结构的XML文件存储针对每个报表的页面设置:

RDLC报表(七) - 了啦 - 了啦的博客<?xml version="1.0" standalone="yes"?>
RDLC报表(七) - 了啦 - 了啦的博客
<ReportSettings>
RDLC报表(七) - 了啦 - 了啦的博客
<采购订单>
RDLC报表(七) - 了啦 - 了啦的博客
<ReportName>采购订单</ReportName>
RDLC报表(七) - 了啦 - 了啦的博客
<PrinterName>EPSON LQ-1600KIII</PrinterName>
RDLC报表(七) - 了啦 - 了啦的博客
<PaperName>Test</PaperName>
RDLC报表(七) - 了啦 - 了啦的博客
<PageWidth>8.00</PageWidth>
RDLC报表(七) - 了啦 - 了啦的博客
<PageHeight>8.00</PageHeight>
RDLC报表(七) - 了啦 - 了啦的博客
<MarginTop>0.2</MarginTop>
RDLC报表(七) - 了啦 - 了啦的博客
<MarginBottom>0.2</MarginBottom>
RDLC报表(七) - 了啦 - 了啦的博客
<MarginLeft>0.2</MarginLeft>
RDLC报表(七) - 了啦 - 了啦的博客
<MarginRight>0.2</MarginRight>
RDLC报表(七) - 了啦 - 了啦的博客
<Orientation>横向</Orientation>
RDLC报表(七) - 了啦 - 了啦的博客
</采购订单>
RDLC报表(七) - 了啦 - 了啦的博客
</ReportSettings>

当然,这种格式的XML配置文件是用DataSet来读写更新的,因为这种方法比较简单。

页面设置窗体上有一个关于打印方向的设置,在(六)中有一个问题忘记阐述了,就是关于打印方向的。因为DeviceInfo结构中并没有打印方向的设置,所以在生成DeviceInfo结构的字符串时,应该根据打印方向来设置DeviceInfo结构的页高和页宽,见(五)中给出的EMFDeviceInfo类的属性DeviceInfoString。放在这里补充说一下。

完整的页面设置窗体的代码下载