Stimulsoft Reports.Net开发者常见Q&A——其它常见问题(下)

原创|使用教程|编辑:郑恭琳|2016-01-08 13:19:01.000|阅读 2213 次

概述:本片文章主要介绍Stimulsoft Reports.Net开发者遇到的一些常见问题及解决方案。

相关链接:

< Stimulsoft Reports.Net v2015.3最新版本下载>

16.怎么从一个URL加载图像?

使用下面的代码加载Bitmap格式的图像:

Image1.Image = Stimulsoft.Base.Drawing.StiImageFromURL.LoadBitmap("http://www.domain.com/bitmap.gif");  

使用下面的代码加载Metafile格式的图像:

Image1.Image = Stimulsoft.Base.Drawing.StiImageFromURL.LoadMetafile("http://www.domain.com/bitmap.emf");

你还可以使用图像组件的ImageURL属性。

17.如何查找已加载报表的文件名称?

你可以从ReportFile属性获取以前的文件路径。示例如下:

string path = report.ReportFile;

18.怎么在预览中修改CheckBox的值?

使用一种可以在预览报表时通过点击事件实现在预览窗口添加一些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

19.怎么修改页码?

你只需要分配系统变量PageNumber的值即可,例:

PageNumber = 1;

同样你还可以使用ResetPageNumber属性。

20.有什么方法实现在第二页的数据带打印标题吗?

你可以使用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

21.怎么处理重复值?

Stimulsoft

ProcessingDuplicates属性有以下值:

  • ProcessingDuplicates=Merge—合并重复值
  • ProcessingDuplicates=None—重复值不作任何处理
  • ProcessingDuplicates=Hide—只输出重复值的第一个字符串

22.怎么给事件添加事件处理器?

  1. 在你调用Show后,报表引擎会自动调用Compile方法并创建一个新的报表-report.CompiledReport.
    使用一下代码添加事件处理器:
    C#
    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()
    该代码的处理器处理编译过的报表的事件。
  2. 你可以直接设置事件脚本:
    C#
    component.BeforePrintEvent.Script = "MessageBox.Show(\"test\")";
    VB
    Component.BeforePrintEvent.Script = "MessageBox.Show(""test"")"
    你可以指定事件的脚本,在报表编译后脚本就会生成一个事件处理器。

23.怎么访问报表的页面?

报表的页面存储在报表的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)

24.如何在不打印的情况下获取一个数据带的总和?

你需要将数据带的高度减小为0。

25.如何在Expression的基础上对数据进行排序?

通常你需要在表达式的基础上对数据进行排序。计算的结果取决于数据源中的一些字段。例如你已经有一些通过字符串表示的数字,如果不将这些字符串数据源转换为数字格式就进行排序,那么数据源中的数字顺序将不被编译成数字的自然顺序。数字有不同的精度并且被排序为字符串:

1000
20
300

如果更改列的字符串类型为数值型,那么就会被正确排序。但是,如何在不改变数据源类型的情况下进行排序呢?为此,你可以使用Expression作为排序的条件。

{int.Parse(MyDataSource.MyColumn)}

因为不能指定表达式作为排序的条件,那么你需要使用下面的技巧。

将你的排序修改为分组。指定表达式(见下文)作为分组的条件用于分类,将GroupHeaderBnd的高度设置为0。

Stimulsoft

以上所有步骤都完成后,字符串就会被正确的排序啦。

20
300
1000

注意:在表达式中你可以使用表中的任何行进行排序。

26.交叉报表通过3张表渲染?

让我们看看下面的任务。例如,我们需要通过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中的一个稍小一点的查询。

27.GetValue事件处理器的RichText组件中的文本格式化相关的问题?

有时你需要格式化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处理器设置之后:

Stimulsoft

RichText组件的属性如下表:

属性 功能
SelectionAlignment 控制RTF的文本对齐。
SelectionHangingIndent 设置SelectionHangingIndent属性来表示文本段落中的第一行的左边缘和在同一段落后续行的左边缘之间的像素间距的整数。
SelectionIndent 整数值。设置在控制的左边缘与文本的左边缘之间的像素间距。设置SelectionHangingIndent属性来表示文本段落中的第一行的左边缘和在 同一段落后续行的左边缘之间的像素间距的整数。SelectionHangingIndent属性的值仅适用于第一行下面环绕的段落行。
SelectionRightIndent 将SelectionRightIndent属性设置为整数代表在控制的右边缘与文本的右边缘之间的像素间距。

28.如何使用RichText输出RTF格式的文本?

在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))

29.Stimulsoft DLL支持模糊或嵌入吗?

Stimulsoft DLL不支持模糊或嵌入。

30.怎么添加一个目录表到多页报表?

一个多页的报告可能会很长,通常需要一个目录表,让读者很容易寻找信息。不幸的是目录表的页码是未知的,直到报表已经被渲染,因此这是一个相当复杂的任务。但是,使用变量和Stimulsoft Reports的页面BeginRender、EndRender事件是完全可能实现这样的自动目录表的:

Stimulsoft

使用这种方法目录对应的页码将根据报表的页码自动计算——如果一个页面扩展到多页,那么页码会自动调整以显示每个章节的正确起始页。一旦你创建你的目录页,并添加必要的文字组件,那么你的报表生成该功能的步骤如下:

创建一个Flag变量

第一步是在报表字典中创建一个名为'flag'的布尔变量:

Stimulsoft

该标志将被用于跟踪一个页面锚是否应该被添加到当前页面。

注意: 该变量名是不是强制性的,你可以根据自己的需求进行修改。

设置标签

设置用于输出页码的每个文本组件的Tag属性(位于对象检查Interaction的下方)为显示在目录表的名称。在上面的例子中第一页包含“DirectorsOfficersAndAdvisers',因此这将是其标签值。重复此过程,每增加一页,被列入目录表中。

设置文本表达式

为了在目录表中获得相应的页码,我们将使用GetAnchorPageNumber方法的文本表达式。将每一个输出页码的文本组件设置表达式:

{GetAnchorPageNumber(sender.TagValue)}

与设置标记时不同,你可以为每个文本组件使用完全相同的表达式。

给BeginRender事件添加代码

通过点击对象检查中事件旁边的省略号为每个页面打开用于BeginRender的事件编辑器,然后添加如下代码:

Stimulsoft

为报告中的每个页面添加相同的代码,只是AddAnchor调用应进行修改,以便在每种情况下将相关页面的名称显示为参数。

给EndRender事件添加代码

通过点击对象检查中事件旁边的省略号为每个页面打开用于EndRender的事件编辑器,然后添加如下代码:

flag = true;

同样你可以为每一个页面使用相同的表达式。现在你就可以打印或预览报表,并且目录表的页码将会被正确的计算。

购买最新正版授权!详情请"咨询在线客服"

迎春纳福,金猴献瑞,革新之年双节同庆,惠享不停惊喜连连!优惠详情点击查看>>



标签:报表解决方案报表.NET报表控件报表设计

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果

登录 慧都网发表评论


jannie 2016-01-08 16:50:05.000
0

见过最全的Stimulsoft Reports.Net开发者常见Q&A锦集了,赞~大大节省了开发中处理问题的时间


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
title
相关厂商
相关产品
Stimulsoft Reports.Net

一个基于.NET框架的报表生成器,能够帮助你创建结构、功能丰富的报表。报表设计器界面友好,使用便捷,让你轻松创建所有报表。

在线
客服
在线
QQ
电话
咨询
400-700-1020
购物车 反馈 返回
顶部
在线客服系统
live chat