C# winfom 水晶报表(For VS.NET2010)设置纵向打印,打印出的却是横向的,编程实现,勿手动设置

hiwcn 2012-08-08 02:24:54

C# winfom 水晶报表(For VS.NET2010)设置纵向打印,打印出的却是横向的,请朋友们指点下.找出问题原因.

以编程方式实现,勿提供手动设置的方案.

代码如下:
private void 打印DToolStripMenuItem_Click(object sender, EventArgs e)
{
ReportDocument crReportDocument = new ReportDocument();
//Create an instance of a report
crReportDocument = new JcApp.Report.RptStock();// RptStock.rpt为水晶报表文件
//Use error handling in case an error occurs
try
{
//Set the printer name to print the report to. By default the sample
//report does not have a defult printer specified. This will tell the
//engine to use the specified printer to print the report. Print out
//a test page (from Printer properties) to get the correct value.
System.Drawing.Printing.PrintDocument printDocument = new System.Drawing.Printing.PrintDocument();
string strPrintName = printDocument.PrinterSettings.PrinterName;
crReportDocument.PrintOptions.PrinterName = strPrintName;

//根据指定纸张格式名称设置纸张格式
Microsoft.Win32.RegistryKey rk;
if (!strPrintName.StartsWith(@"\\")) //本地打印机
rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Printers\\" + strPrintName + "\\DsDriver");
else //网络打印机
{

string[] p = strPrintName.Remove(0, 2).Split(new char[] { '\\' });
string path = "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Print\\Providers\\LanMan Print Services\\Servers\\" + p[0] + "\\Printers\\" + p[1] + "\\DsDriver";
rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(path);
}
string[] papers = (string[])(rk.GetValue("printMediaSupported"));
//纸张格式名称与纸张格式id的键值对
System.Collections.Hashtable ht = new System.Collections.Hashtable();
for (int i = 0; i < papers.Length; i++)
{
ht.Add(papers[i], i);
}
//根据纸型名称在其名称列表中的索引,获取该索引在调用Get_PaperSizes后的size数组中的对应值
string strPageSizeName = "241二等分";//自定义纸张 宽度:2100mm 高度:1390mm
int[] sizes = PaperSizeGetter.Get_PaperSizes(strPrintName);
int paperSizeid = sizes[Convert.ToInt32(ht[strPageSizeName])];//sizes[this.listBoxPapers.SelectedIndex];

//将该size赋值给报表对象
crReportDocument.PrintOptions.PaperSize = (CrystalDecisions.Shared.PaperSize)(paperSizeid);

crReportDocument.PrintToPrinter(1, true, 1, 1);

MessageBox.Show("打印完成!");
}
catch (Exception err)
{
MessageBox.Show(err.ToString());
}
}



//根据纸张名称获取其所在本地机上的PaperSize:调用的是PaperSizeGetter.Get_PaperSizes静态方法(是从水晶报表中reflect精简出来的,版权归原作者所有)
public class PaperSizeGetter
{
public static string OutputPort = String.Empty;

[DllImport("winspool.drv", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int DeviceCapabilities(string pDevice, string pPort, short fwCapabilities, IntPtr pOutput, IntPtr pDevMode);

public static int[] Get_PaperSizes(string printer)
{
string text1 = printer;
int num1 = FastDeviceCapabilities(0x10, IntPtr.Zero, -1, text1);
if (num1 == -1)
{
return new int[0];
}
int num2 = Marshal.SystemDefaultCharSize * 0x40;
IntPtr ptr1 = Marshal.AllocCoTaskMem(num2 * num1);
FastDeviceCapabilities(0x10, ptr1, -1, text1);
IntPtr ptr2 = Marshal.AllocCoTaskMem(2 * num1);
FastDeviceCapabilities(2, ptr2, -1, text1);
IntPtr ptr3 = Marshal.AllocCoTaskMem(8 * num1);
FastDeviceCapabilities(3, ptr3, -1, text1);
int[] sizeArray1 = new int[num1];
for (int num3 = 0; num3 < num1; num3++)
{
string text2 = Marshal.PtrToStringAuto((IntPtr)(((long)ptr1) + (num2 * num3)), 0x40);
int num4 = text2.IndexOf('\0');
if (num4 > -1)
{
text2 = text2.Substring(0, num4);
}
short num5 = Marshal.ReadInt16((IntPtr)(((long)ptr2) + (num3 * 2)));
int num6 = Marshal.ReadInt32((IntPtr)(((long)ptr3) + (num3 * 8)));
int num7 = Marshal.ReadInt32((IntPtr)((((long)ptr3) + (num3 * 8)) + 4));
sizeArray1[num3] = System.Convert.ToInt32(num5);
}
Marshal.FreeCoTaskMem(ptr1);
Marshal.FreeCoTaskMem(ptr2);
Marshal.FreeCoTaskMem(ptr3);
return sizeArray1;
}
private static int FastDeviceCapabilities(short capability, IntPtr pointerToBuffer, int defaultValue, string printerName)
{
int num1 = DeviceCapabilities(printerName, OutputPort, capability, pointerToBuffer, IntPtr.Zero);
if (num1 == -1)
{
return defaultValue;
}
return num1;
}
}

...全文
143 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuyouke_ 2013-10-09
  • 打赏
  • 举报
回复
赞一个,好好学习一下
e表号称水晶报表杀手。e表是一个功能强大的Web报表工具,提供了高效的报表设计方案、强大的Web报表展现能力、灵活的部署机制。使用e表可使复杂报表的设计简单化,以往难以实现的报表可以轻松实现,避免了大量的复杂SQL编写以及编程来准备数据,报表设计的效率大大提高。 e表是纯 .NET的报表工具,在.NET环境下可以无缝嵌入应用系统,因此在.NET应用中比其他非.NET的报表工具有明显优势。 用户可以通过报表设计器直接设计各种复杂格式的报表,在运行时通过报表服务器自动提取数据生成报表,可以通过Web方式展现、打印、导。 e表内置了一个强大的表单设计器,使用它可以可视化地设计报表的查询条件的输入界面。e表的报表设计器也是在IE浏览器中直接运行的。这样用户可以很方便地将报表设计器嵌入到自己的产品中。 Excel绘表方式能解决报表样式问题,但Excel的这种基于自由单元格的模型和基于二维表的数据库物理表模型没法有机的结合起来。控件拖拽式绘表能很好地从数据库中取数,但又无法处理复杂的报表样式。因而迫切需要一种新的报表实现方式。 e表就是采用了一种新的报表实现方式。在e表中,一个报表被认为是由单元格扩展而来的。即先采用类Excel方式绘制好静态报表。当然在其中预置了一些扩展单元格的公式。而在运行报表时根据公式横向纵向扩展单元格而得到真正的报表结果。这样就同时兼顾了报表样式和从数据库中自动取数这两个方面。 控件拖拽式报表工具除了样式绘制麻烦之外,还有它最终是由单个数据集循环展开而得到报表的致命弱点,报表的形成是由单个数据集的循环再结合报表格式文件的定义而得到真正的报表结果,它相当于只有一个循环运算点。 而e表因为可以在一个类Excel的静态网格报表上定义无限多的扩展公式,运算报表时这些扩展公式同时扩展,每个扩展公式可以基于不同的数据集。它相当于有无限多个循环运算点。因此报表的表现力大大增强,可以说是复杂统计报表的克星。 一般来说,大多数的报表都需要根据输入的报表参数而得到不同的结果。例如:日报表需要根据输入的日期来得到到底是要哪一天的日报表。这时就需要日期的输入界面,它被称为是查询条件的输入表单。 查询条件的输入界面是千变万化,没有一定之规的。很多报表工具只是提供一个自动生成这个界面的功能。可想而知,自动生成的界面往往无法满足用户的多样化的需求。甚至于有的报表工具就没有此功能,由用户用程序写去。而查询条件输入表单是报表密不可分且又不可或缺的一部分,如果查询条件输入表单没做好的话,往往会造成用户在使用了报表工具后还是需要大量的编码工作。 e表内置了强大的eform可视化自定义web表单工具的主要部分,由它来解决查询条件输入表单的制作问题。它提供了下拉列表,页签控件等丰富的页面控件,完整的数据验证机制,也可以通过自定义事件来实现复杂的控制。通过将输入控件和报表参数进行绑定来将查询条件的输入表单和报表联系起来。它采用可视化的设计界面,既可以通过简单的控件拖拉绑定实现简单的查询条件输入表单,又可以通过写事件的代码来实现复杂的查询条件输入表单。一举解决了查询条件输入表单的多样化问题。

4,820

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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