原创|使用教程|编辑:郑恭琳|2016-01-08 13:19:01.000|阅读 2863 次
概述:本片文章主要介绍Stimulsoft Reports.Net开发者遇到的一些常见问题及解决方案。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
< Stimulsoft Reports.Net v2015.3最新版本下载>
使用下面的代码加载Bitmap格式的图像:
Image1.Image = Stimulsoft.Base.Drawing.StiImageFromURL.LoadBitmap("//www.domain.com/bitmap.gif");
使用下面的代码加载Metafile格式的图像:
Image1.Image = Stimulsoft.Base.Drawing.StiImageFromURL.LoadMetafile("//www.domain.com/bitmap.emf");
你还可以使用图像组件的ImageURL属性。
你可以从ReportFile属性获取以前的文件路径。示例如下:
string path = report.ReportFile;
使用一种可以在预览报表时通过点击事件实现在预览窗口添加一些X标记的功能。
使用CheckStyle = Cross用于X标记,然后编写ClickEvent事件处理器:
C#
Stimulsoft.Report.Components.StiCheckBox check = sender as Stimulsoft.Report.Components.StiCheckBox; if (check.CheckedValue == null || ((bool)check.CheckedValue) == false)check.CheckedValue = true; else check.CheckedValue = false; Invalidate();
VB
Dim box1 As Stimulsoft.Report.Components.StiCheckBox = CType(sender, Stimulsoft.Report.Components.StiCheckBox) If ((box1.CheckedValue Is Nothing) OrElse Not CType(box1.CheckedValue, Boolean)) Then box1.CheckedValue = True Else box1.CheckedValue = False End If MyBase.Invalidate
你只需要分配系统变量PageNumber的值即可,例:
PageNumber = 1;
同样你还可以使用ResetPageNumber属性。
你可以使用BeforePrintEvent,代码如下:
C#
if (PageNumber == 1)HeaderBand1.Enabled = false; else HeaderBand1.Enabled = true;
VB
If (MyBase.PageNumber = 1) Then Me.HeaderBand1.Enabled = False Else Me.HeaderBand1.Enabled = True End If
ProcessingDuplicates属性有以下值:
report.Compile(); report.CompiledReport.GetComponents()["ComponentName"].BeforePrint += new EventHandler(Component_BeforePrint); report.Show();VB
Report.Compile() AddHandler Report.CompiledReport.GetComponents.Item("ComponentName").BeforePrint, New EventHandler(AddressOf Me.Component_BeforePrint) Report.Show()该代码的处理器处理编译过的报表的事件。
component.BeforePrintEvent.Script = "MessageBox.Show(\"test\")";VB
Component.BeforePrintEvent.Script = "MessageBox.Show(""test"")"你可以指定事件的脚本,在报表编译后脚本就会生成一个事件处理器。
报表的页面存储在报表的Pages集中。示例如下:
C#
//Returns the first page of a report StiPage page = report.Pages[0];
VB
'Returns the first page of a report Dim Page As StiPage = Report.Pages(0)
你需要将数据带的高度减小为0。
通常你需要在表达式的基础上对数据进行排序。计算的结果取决于数据源中的一些字段。例如你已经有一些通过字符串表示的数字,如果不将这些字符串数据源转换为数字格式就进行排序,那么数据源中的数字顺序将不被编译成数字的自然顺序。数字有不同的精度并且被排序为字符串:
1000 20 300
如果更改列的字符串类型为数值型,那么就会被正确排序。但是,如何在不改变数据源类型的情况下进行排序呢?为此,你可以使用Expression作为排序的条件。
{int.Parse(MyDataSource.MyColumn)}
因为不能指定表达式作为排序的条件,那么你需要使用下面的技巧。
将你的排序修改为分组。指定表达式(见下文)作为分组的条件用于分类,将GroupHeaderBnd的高度设置为0。
以上所有步骤都完成后,字符串就会被正确的排序啦。
20 300 1000
注意:在表达式中你可以使用表中的任何行进行排序。
让我们看看下面的任务。例如,我们需要通过3个表渲染报表:Categories、Products、Order_Details。
我们必须在报告中获取下一个表—通过Products字符串,按Categories列。Order_Details中的行/列交叉点将要被输出。 Order_Details利用关系与Categories和Products表关联。
放置DataBand到页面上,然后是Products数据源。将CrossTab放置到DataBand并显示Categories的数据源。在CrossBand放置StiText并显示Order_Details的字段。滚动Order_Details到需要给StiText组件的OnBeforePrint添加处理程序的行。
Order_Details.First(); while (!Order_Details.IsEof) { if (Order_Details.OrderID == Categories.CategoryID && Order_Details.OrderID == Products.ProductID) break; Order_Details.Next(); }
为什么Order_Details不能通过与Products和Categories已存在的相关性自动滚动到该行?因为数据源被滚动时与Databand相关。因为很多的相关性因此不能在Delphi中滚动。
这种情况下最好的方法是—一个大SQL查询和一个交叉表。或者是放置在Databand中的一个稍小一点的查询。
有时你需要格式化RichTextBox对象中的RTF文本。你可以使用的GetValue事件处理程序。对于此操作,你需要创建StiRichText组件。具体代码如下:
C#
// Create auxiliary StiRichTextBox object StiRichTextBox rich = new StiRichTextBox(); // rtf-text unpacking rich.Rtf = StiRichText.UnpackRtf(System.Xml.XmlConvert.DecodeName(e.Value)); //Select rtf range //Select area of a text for using formatting to it rich.SelectionStart = 0; rich.SelectionLength = 9; //Using lowercase to selected text rich.SelectionCharOffset = -5; // Selected text with center alignment rich.SelectionAlignment = StiRtfSelectionAlign.Center; // Set the color of the selected text rich.SelectionColor = Color.Red; // Set the font for selected text rich.SelectionFont = new Font("Arial", 20, FontStyle.Bold); rich.SelectionStart = 9; rich.SelectionLength = 3; rich.SelectionFont = new Font("Arial", 25); rich.SelectionColor = Color.Blue; rich.SelectionStart = 12; rich.SelectionLength = 11; rich.SelectionFont = new Font("Arial", 20, FontStyle.Bold); //Set selected text in uppercase rich.SelectionCharOffset = 10; // Rtf text packing e.Value = System.Xml.XmlConvert.EncodeName(StiRichText.PackRtf(rich.Rtf)); // Release of resources of additional component rich.Dispose();
VB
Dim box1 As New StiRichTextBox box1.Rtf = StiRichText.UnpackRtf(System.Xml.XmlConvert.DecodeName(e.Value)) box1.SelectionStart = 0 box1.SelectionLength = 9 box1.SelectionCharOffset = -5 box1.SelectionAlignment = StiRtfSelectionAlign.Center box1.SelectionColor = Color.Red box1.SelectionFont = New Font("Arial", 20, FontStyle.Bold) box1.SelectionStart = 9 box1.SelectionLength = 3 box1.SelectionFont = New Font("Arial", 25) box1.SelectionColor = Color.Blue box1.SelectionStart = 12 box1.SelectionLength = 11 box1.SelectionFont = New Font("Arial", 20, FontStyle.Bold) box1.SelectionCharOffset = 10 e.Value = System.Xml.XmlConvert.EncodeName(StiRichText.PackRtf(box1.Rtf)) box1.Dispose
下图显示在StiRichText组件创建之前,GetValue处理器设置之后:
RichText组件的属性如下表:
属性 | 功能 |
SelectionAlignment | 控制RTF的文本对齐。 |
SelectionHangingIndent | 设置SelectionHangingIndent属性来表示文本段落中的第一行的左边缘和在同一段落后续行的左边缘之间的像素间距的整数。 |
SelectionIndent | 整数值。设置在控制的左边缘与文本的左边缘之间的像素间距。设置SelectionHangingIndent属性来表示文本段落中的第一行的左边缘和在 同一段落后续行的左边缘之间的像素间距的整数。SelectionHangingIndent属性的值仅适用于第一行下面环绕的段落行。 |
SelectionRightIndent | 将SelectionRightIndent属性设置为整数代表在控制的右边缘与文本的右边缘之间的像素间距。 |
在RichText的GetValueEvent事件写入以下代码:
C#
System.IO.StreamReader reader = new System.IO.StreamReader("d:\\script.rtf"); string str = reader.ReadToEnd(); reader.Close(); e.Value = System.Xml.XmlConvert.EncodeName(StiRichText.PackRtf(str));
VB
Dim Reader As System.IO.StreamReader = New System.IO.StreamReader("d:\\script.rtf") Dim Str As String = Reader.ReadToEnd() Reader.Close() e.Value = System.Xml.XmlConvert.EncodeName(StiRichText.PackRtf(Str))
Stimulsoft DLL不支持模糊或嵌入。
一个多页的报告可能会很长,通常需要一个目录表,让读者很容易寻找信息。不幸的是目录表的页码是未知的,直到报表已经被渲染,因此这是一个相当复杂的任务。但是,使用变量和Stimulsoft Reports的页面BeginRender、EndRender事件是完全可能实现这样的自动目录表的:
使用这种方法目录对应的页码将根据报表的页码自动计算——如果一个页面扩展到多页,那么页码会自动调整以显示每个章节的正确起始页。一旦你创建你的目录页,并添加必要的文字组件,那么你的报表生成该功能的步骤如下:
创建一个Flag变量
第一步是在报表字典中创建一个名为'flag'的布尔变量:
该标志将被用于跟踪一个页面锚是否应该被添加到当前页面。
注意: 该变量名是不是强制性的,你可以根据自己的需求进行修改。
设置标签
设置用于输出页码的每个文本组件的Tag属性(位于对象检查Interaction的下方)为显示在目录表的名称。在上面的例子中第一页包含“DirectorsOfficersAndAdvisers',因此这将是其标签值。重复此过程,每增加一页,被列入目录表中。
设置文本表达式
为了在目录表中获得相应的页码,我们将使用GetAnchorPageNumber方法的文本表达式。将每一个输出页码的文本组件设置表达式:
{GetAnchorPageNumber(sender.TagValue)}
与设置标记时不同,你可以为每个文本组件使用完全相同的表达式。
给BeginRender事件添加代码
通过点击对象检查中事件旁边的省略号为每个页面打开用于BeginRender的事件编辑器,然后添加如下代码:
为报告中的每个页面添加相同的代码,只是AddAnchor调用应进行修改,以便在每种情况下将相关页面的名称显示为参数。
给EndRender事件添加代码
通过点击对象检查中事件旁边的省略号为每个页面打开用于EndRender的事件编辑器,然后添加如下代码:
flag = true;
同样你可以为每一个页面使用相同的表达式。现在你就可以打印或预览报表,并且目录表的页码将会被正确的计算。
购买最新正版授权!详情请""
迎春纳福,金猴献瑞,革新之年双节同庆,惠享不停惊喜连连!优惠详情点击查看>>
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn