Spread for Windows Forms高级主题(8)---通过暂停布局提高性能

一种改善控件性能的方法是,当需要对许多单元格进行变动时,可以先保持或挂起重画,直到所有的变动都完成时再进行。通过在对单元格修改和重算时保持重画(挂起布局),然后再恢复布局并重画所有单元格控件能够节省很多时间,并且仍然能为用户展现一个全新的界面。

布局对象

布局是一个对象,它保存了计算后的值(像单元格的宽度和高度,合并,以及视图),用来绘制控件的当前状态。这些值可能包括到底有多少视图,每一个视图左上方的单元格是什么,每一行及每一列有多大以及每一个视图有多少单元格是当前可见的,等等。使用布局对象的目的是,通过保存绘制控件过程所使用已计算好的布局值,每次控件重画时重新使用它们而不是每次都进行重算,来优化控件的绘制。当跟踪到一个需要重新生成布局对象的改变发生时,绘制代码就会丢弃现有的布局对象,并计算出一个新的对象。布局对象不属于公共API,但是它们缓存了绘制表单所需的所有信息,像列宽,行高,单元格合并,单元格溢出以及总是可见的长方形单元格标注(Cell.NoteStyle = NoteStyle.StickyNote)。

暂停布局逻辑

为了改善性能,你可以暂停布局,这样可以暂停布局对象的更新,因此控件不会在重画的计算上花费时间,直到恢复布局。两个方法可以完成这些操作,FpSpread类中的SuspendLayout 和ResumeLayout方法。一定要在一个特定操作的范围内同时使用这两个方法,否则暂停布局后就会出现问题,不能恢复。

当对表单进行修改时,SuspendLayout 方法能够阻止控件重新计算列、行和单元格的布局。如果你在一个代码块中对表单做了大量的变动,使用SuspendLayout方法可以避免控件在每一次变动发生时对布局对象所做的多余的中间计算,在所有变动完成之后使用ResumeLayout(true)方法重新计算布局对象。这样可以极大的提高控件的性能;另外基于表单所需要的特性,还有许多其他方法可以提高控件的性能。

System.DateTime st = System.DateTime.Now;

FpSpread1.SuspendLayout();

FpSpread1.Sheets(0).ActiveSkin = FarPoint.Win.Spread.SheetSkin.Load("d:\\temp\\skin.skn");

FpSpread1.ResumeLayout();

MsgBox("Duration (ticks)="& System.DateTime.Now.Ticks - st.Ticks)

privatevoid PerformInitialSetup()

{

// (0) used for property labels.

_propertyLabelOrdinal =0;

// Set up the spread

spread.SuspendLayout();

SheetView sheet = spread.ActiveSheet;

sheet.Models.ColumnHeaderData =new HeaderDataModel(spread, _orientation);

sheet.Models.Style =new SheetStyleModel(_orientation);

spread.NamedStyles = _config.Styles.NamedStyles;

// Insert initial data

sheet.Columns.Count =2;

foreach (Block block in _config.Blocks)

{

// Insert any leading blank rows

if (block.SpaceBefore >0) sheet.Rows.Add(sheet.Rows.Count, block.SpaceBefore);

if (block.DealProperties !=null)

{

int rowIndex = sheet.Rows.Count;

sheet.Rows.Add(rowIndex, block.DealProperties.Count);

foreach (DealProperty property in block.DealProperties) {

sheet.Cells[rowIndex, _propertyLabelOrdinal].Value = property;

sheet.Rows[rowIndex].StyleName = block.StyleName;

rowIndex++;

}

}

// Insert any trailing blank rows

if (block.SpaceAfter >0) sheet.Rows.Add(sheet.Rows.Count, block.SpaceAfter);

}

// Set initial styles

sheet.Columns[_propertyLabelOrdinal].StyleName ="dealPropertyLabels";

spread.ResumeLayout();

}

  

暂停通知

当布局被暂停后,如果没有在同一个代码块中有相应的恢复方法就会出现异常,控件会显示一个通知“布局处于暂停状态”。如果控件的状态变成这样,说明布局对象包含了非法的数据(大多数情况下为错误的数值),当控件使用非法的布局数据绘制时就会导致异常发生。在绘制控件过程中,如果发生未被捕捉的异常,通知就会出现,并且在异常发生时布局也会被暂停。

这些只会在使用SuspendLayout方法暂停布局时才会发生,然后对控件状态所做的改变也会生效,控件也会以某种方式使用非法的布局对象进行再次绘制。也可能存在这样的异常,它导致上述消息的显示,但却与暂停布局无关;例如,IRenderer.PaintCell方法调用过程中由自定义单元格类型对象抛出的异常。对控件状态所做的任何修改都会触发布局的重计算,但并非所有的改动都是这样。对行或列进行重新排列时,如排序和过滤,肯定需要重计算,但设置文本只有在某些情况下才需要重计算,例如,当你将AllowCellOverflow属性打开时。即使布局被暂停,Spread控件仍然可以使用之前的正确布局信息来绘制控件;但之后Spread控件可能会产生不可预知的情况,例如,当你想要滚动页面而控件却没有反应,也没有显示异常通知。

其他改善性能的方法

如果你不使用手写便笺,那么可以将AutoUpdateNotes属性设置为false,阻止控件对必须被设置为可见或隐藏或可移动的手写便笺进行检查。如果你使用了AllowCellOverflow属性,将其关闭可以提高布局计算的性能,因为每次对单元格中的数据进行修改时,这个特性需要许多对文本宽度的计算。如果你使用了公式,在更新之前将AutoCalculation属性设置为false,然后再将其设回true,并调用Recalculate方法,这样可减少对公式的多余中间计算。

你还可以做一些其他的操作提高性能,如减小控件的大小,或减少一次性显示的列数和行数(布局对象只计算表单的可见部分),或实现你自己的表单模型对象(就像实现了ISheetDataModel接口的数据模型对象),删除不需要的功能特性(例如,当你不需要数据绑定时,就不用实现数据绑定相关的接口)。

同时使用两个方法

大概的程序结构如下:

SuspendLayout

在这里插入你的代码

ResumeLayout

这两个方法用来暂时忽略对布局所做的修改,这样可以进行许多修改操作,而不用在每次修改时进行多余的布局重计算。当布局计算被暂停时,跟踪控件修改的事件处理器不能对布局进行重计算,并且绘制代码不会访问新的布局。在使用嵌套循环修改每一个单元格时,像修改每一个单元格的值,这种情况肯定可以从先暂停布局,然后再恢复布局的方式中获益。

请记住,如果在对控件进行修改时不能从暂时停止布局中获得性能提升,就不要使用这些方法。一定要在同一个代码块中同时使用这两个方法; 否则,如果调用 SuspendLayout方法时没有在同一个代码块中相应的调用 ResumeLayout方法,控件可能无法正确的绘制。

在下面的示例代码中,我们在修改单元格的代码附近的代码块中同时使用了这两个方法。在修改单元格的颜色时,代码暂停了Spread控件的重画,并在之后恢复了重画。

fpSpread1.SuspendLayout();

fpSpread1.Sheets[0].Cells[0, 0, 499, 499].BackColor = Color.White;

fpSpread1.ResumeLayout(true);

  

 

Spread for Windows Forms 5.0 中文版下载地址

附:Spread for Windows Forms高级主题系列文章

Spread for Windows Forms高级主题(1)---底层模型

Spread for Windows Forms高级主题(2)---理解单元格类型

Spread for Windows Forms高级主题(3)---理解单元格的编辑模式

Spread for Windows Forms高级主题(4)---自定义用户交互

Spread for Windows Forms高级主题(5)---数据处理

Spread for Windows Forms高级主题(6)---数据绑定管理

Spread for Windows Forms高级主题(7)---自定义打印的外观

 

相关阅读:

Spread for Windows Forms 7新功能使用指南

Spread Studio 10.0v1 发布

SpreadJS 10.0v1 发布

 

时间: 2024-10-26 10:06:05

Spread for Windows Forms高级主题(8)---通过暂停布局提高性能的相关文章

Spread for Windows Forms高级主题(4)---自定义用户交互

你可以从多方面自定义用户界面来自定义用户与Spread控件的交互方式.同时,你还可以自定义如何处理用户交互方式. 设置允许用户进行的操作 下面的列表总结了通过控件的数据区域,你可以授权用户进行的操作(或者限制用户进行的操作). 允许的用户功能 相关属性或方法 拖拽单元格数据 FpSpread.AllowDragDrop 属性 拖拽并填写单元格数据 FpSpread.AllowDragFill 属性 编辑单元格备注 SheetView.AllowNoteEdit 属性 输入公式 FpSpread.

Spread for Windows Forms高级主题(6)---数据绑定管理

自定义列和区域的数据绑定 当表单被绑定到一个数据集时,表单中的列就会相继的被分配到数据集的区域上.例如,第一个数据域分配给列A,第二个数据区域分配给列B,等等.你也可以改变分配顺序,将任意域分配给任意列. 默认情况下,绑定的表单继承数据库中列的宽度.如果你想要设置你自己的列宽,你可以在绑定Spread控件之后设置列宽,或者将DataAutoSizeColumns属性设置为false并设置列宽. 如果你将多个Spread控件绑定到了一个单一的数据集,你可以将每一个Spread控件中表单的AutoG

Spread for Windows Forms高级主题(3)---单元格的编辑模式

理解单元格的编辑模式 通常情况下,当终端用户双击单元格时,编辑控件将允许用户在该单元格中输入内容.在一个单元格中编辑的能力被称为编辑模式.一些属性和方法可以用来自定义编辑模式的使用. 当一个单元格处于编辑模式时,活动单元格将显示一个I型光标,如下图所示.当该单元格不处于编辑模式时,活动单元格将显示一个焦点长方形,如下图所示. 处于编辑模式下的单元格 被选中但是并不处于编辑模式下的单元格 一个单元格将进入编辑模式(开启编辑模式),当: 用户在单元格中输入内容 用户双击单元格 EditMode属性设

Spread for Windows Forms高级主题(5)---数据处理

使用表单的API处理数据 你可以将数据以有格式或无格式字符串或者数据对象的形式填充到单元格中.将数据填充到单元格的最好方式取决于你想添加字符串数据还是数据对象,以及你想添加数据到单一的单元格还是某个范围内的所有单元格. 举例来说,如果你使用的数据来自用户的文本框中,你可能想要添加由Spread控件解析的字符串数据.如果你想要添加多个值,并想要直接将它们添加到数据模型中,可以以对象的方式添加它们. 下表汇总了在表单级别添加数据的方法. 数据描述 单元格数目 方法名 具有格式的字符串(例如"$1,2

Spread for Windows Forms高级主题(1)---底层模型

底层模型概述 Spread控件提供了很多模型,这些模型提供了自定义控件的基础架构.同时,这些模型作为底层模板,派生出了更多通用的快捷对象. 在不使用Spread的底层模型的情况下,你可以完成许多任务.通过使用Spread设计器或者快捷对象(如单元格.列和行)的属性,你可以在表单上实现许多改变.但是因为表单模型是所有快捷对象的基础,因此在通常情况下,使用表单模型要比使用快捷对象的速度要快.例如,在代码中使用快捷对象设置一个属性值: fpSpread1.Sheets[0].Cells[0, 0].V

Spread for Windows Forms快速入门(14)---文件操作

你可以将数据从Spread中存到几种不同类型的文件中或者可以在Spread中打开几种不同类型的数据文件.通过使用相应的代码,你可以将整个控件,某个特定的表单,或者某个特定单元格区域中的数据保存为几种不同的文件类型或者流.类似的,你可以允许用户对某几种文件类型进行文件操作. 保存到Excel文件 你可以使用ExcelSaveFlags枚举类型的UseOOXMLFormat选项,将数据保存到Excel格式文件(BIFF8 格式)或者Excel 2007 XML 格式(xlsx).默认的,当你保存为E

Spread for Windows Forms快速入门(5)---常用的单元格类型(下)

在上一篇,我们介绍了常用了文本类型单元格.除了文本型单元格外,Spread还支持如下13种图形单元格类型:组合框单元格.按钮单元格.复选框单元格.超链接单元格.进度条单元格.条码单元格.颜色选择器单元格.图片单元.列表框单元格.复合列组合框单元格.复合选项单元格.富文本单元格.滚动条单元格等.下面我们介绍前五种的基本用法. 组合框单元格ComboBoxCellType 你可以使用一个组合框单元格以显示一个可编辑的下拉列表,用户通过在显示的列表中进行选择完成对值的输入.你可以指定项目的列表是否包括

Spread for Windows Forms 7新功能使用指南

表格控件 Spread for WinForms 表格控件兼容Excel的强大功能,并将其嵌入到您的应用系统中.完备的Excel文档支持使得您可以在企业中分享和访问数据信息:内嵌的图表引擎和数据可视化支持让您更加轻松的为商务.工程以及科学应用系统中创建丰富高效的信息中心. 表格控件 Spread for WinForms 7 在此次发布的版本中对过滤功能做了增强.增强过滤功能提供了种类繁多的过滤条件,包括数值.日期.文本和颜色的自动过滤.您可以创建三种类型的过滤器:数据列表.格式或标准.这些过滤

Spread for Windows Forms快速入门(2)---设置Spread表单

让我们从设置Spread的大小和表单的外观开始学习如何定制Spread,这些操作通常放在Form的构造函数中进行,在InitializeComponent()之后调用.   自定义控件的大小 你可以设置Spread控件的规格,这决定了表单中可见的区域的大小.下面的图片中展示了你可以设置的规格,通过设置每一个规格中像素的数量进行设置.   计算Spread控件的高度时,假设滚动条是关闭状态,没有标题,计算所有行的高度以及每一个边界按1个像素计算,所以,如果现在有10行,每行20像素高度,总的高度为