Spread for Windows Forms高级主题(4)---自定义用户交互
你可以从多方面自定义用户界面来自定义用户与Spread控件的交互方式。同时,你还可以自定义如何处理用户交互方式。
设置允许用户进行的操作
下面的列表总结了通过控件的数据区域,你可以授权用户进行的操作(或者限制用户进行的操作)。
允许的用户功能 |
相关属性或方法 |
拖拽单元格数据 |
FpSpread.AllowDragDrop 属性 |
拖拽并填写单元格数据 |
FpSpread.AllowDragFill 属性 |
编辑单元格备注 |
SheetView.AllowNoteEdit 属性 |
输入公式 |
FpSpread.AllowUserFormulas属性 |
筛选行 |
Column.AllowAutoFilter 属性 |
展开或者折叠层次树 |
Get, SetRowExpandable |
移动时钟指针 |
FarPoint.PluginCalendar.WinForms. AllowMoveHands 属性 |
移动行和列 |
FpSpread.AllowRowMove 属性 和 FpSpread.AllowColumnMove 属性 |
进行标准的检索 |
FpSpread.SearchWithDialog 方法) |
进行标准的检索 |
FpSpread.SearchWithDialogAdvanced方法。 |
重置行或列的大小 |
列的Resizable属性 和行的Resizable属性 |
在列标题中,通过点击排序指示器进行筛选 |
Column.AllowAutoSort 属性 |
这里的列表总结了通过控件,你可以授权用户进行的操作(或者限制用户进行的操作)。
允许的用户功能 |
相关属性或方法 |
限制对行或者列的访问 |
SheetView.RestrictColumns 属性 SheetView.RestrictRows 属性 |
放大,或者缩放组件显示 |
FpSpread.AllowUserZoom 属性 |
使用剪贴板快捷键 |
FarPoint.Win.SuperEditBase. AllowClipboardKeys 属性 |
编辑表单名称 |
FpSpread.TabStrip.Editable 属性 |
指定用户可以选择的对象
默认情况下,用户可以在表单中选择一个单元格、一列单元格、一行单元格或者整个表单。你可以使用表单操作方式下,选择策略和表单单元来决定选择如何发生。下列的表格总结了可用于指定用户选择内容的选项:
用户可以选择什么 |
何时为表单设置 |
单元格 |
FpSpread.SelectionBlockOptions.Cells |
行 |
FpSpread.SelectionBlockOptions.Rows |
列 |
FpSpread.SelectionBlockOptions.Columns |
表单 |
FpSpread.SelectionBlockOptions.Sheet |
组合 |
FpSpread.SelectionBlockOptions.number。number 表示其他数字的组合(例如6 = 2 + 4,行和列) |
单元格,区域单元格或者多区域单元格 |
OperationMode.Normal,根据SelectionPolicy属性决定 |
只选择行,不允许编辑 |
OperationMode.SingleSelect |
只选择行,允许编辑 |
OperationMode.RowMode |
选择多个连续的行,不允许编辑 |
OperationMode.MultiSelect |
选择多个非连续的行,不允许编辑 |
OperationMode.ExtendedSelect |
注意FpSpread.SelectionBlockOptions设置在Spread控件层,而OperationMode位于表单层。
OperationMode 和 SelectionBlockOptions 属性的设置将会影响用户与表单交互,这意味着用户可以选择的内容不一定是应用程序可以选择的。如果你想自定义用户和应用程序均可选择的内容,请设置SelectionUnit属性。
你还可以使用RestrictRows 和 RestrictColumns方法来限定可以被编辑的单元格。该限制限定了用户不能跨越到下一行或者列输入数据。如果你需要更多的信息,请参阅SheetView类的SelectionPolicy属性和 SelectionUnit属性,以及FpSpread类的SelectionBlockOptions属性。如果你需要更多的细节,请参阅OperationMode枚举和SelectionBlockOptions 枚举.
下面的示例代码对表单进行了相关设置,允许用户只选择一个单元格或者选择一定区域内的单元格,包括多个区域的单元格。但是在本示例中用户不能够选择列,行,或者整个表单。
// Set option so users can select only cells. fpSpread1.SelectionBlockOptions = FarPoint.Win.Spread.SelectionBlockOptions.Cells; // Set operation mode and let users select multiple blocks of cells. fpSpread1.Sheets[0].OperationMode = FarPoint.Win.Spread.OperationMode.Normal; fpSpread1.Sheets[0].SelectionPolicy = FarPoint.Win.Spread.Model.SelectionPolicy.MultiRange
如何使用选择
当用户选定一个区域内的单元格时,该区域的单元格可以拥有一个单独的背景色和前景颜色,用来区分表单内的其他单元格。你可以通过编程处理选择的多个方面。在代码中,你可以添加或者删除选择,并且你可以查找被选择的单元。本主题总结了你可以在代码中执行的一些操作。
- 如果你希望添加一个选择(一定区域的单元格以被选择的方式显示),你需要使用表单的AddSelection方法,并制定开始的行和列,以及选择中的行数和列数。
- 使用表单的GetSelections方法获取以选择形式显示的区域单元格。使用表单的GetSelection方法返回一个特定选择。
- 使用表单的ClearSelection方法删除所有的选择。使用表单的RemoveSelection方法,并指定行和列删除一个特定的选择,该选择的行号和列号同时从选择中删除。
- 当通过编程设置了一个新的活动单元格时,请使用SetActiveCell方法中的布尔型参数clearSelection清除所有的选择。
- 使用FpSpread类中的RetainSelectionBlock属性使一个选择保持高亮。
- 你可以使用FpSpread类中的MoveActiveOnFocus属性移动一个被选择的单元格。
- 如果你需要使用关于选择的事件,请参阅SelectionChangedEventArgs类。
如果你需要选择一个表单中所有的单元格,请使用该表单的RowCount 和 ColumnCount属性,如下面的代码所示:
FpSpread1.ActiveSheet.Models.Selection.SetSelection(0, 0, FpSpread1.ActiveSheet.RowCount, FpSpread1.ActiveSheet.ColumnCount)
如果某一行或者某一列的所有单元格均被选择(例如用户点击行标题或者列标题进行了一次选择),DefaultSheetSelectionModel类(以及IDisjointSelection接口)的 GetSelections方法将会返回-1给相应的RowCount或者ColumnCount。
下面的示例代码选择了两个区域的单元格。
// Set the sheet to allow multiple range selections. fpSpread1.Sheets[0].SelectionPolicy = FarPoint.Win.Spread.Model.SelectionPolicy.MultiRange; // Select cells C3 through D4. fpSpread1.Sheets[0].AddSelection(2, 2, 2, 2); // Select cells F6 through H8. fpSpread1.Sheets[0].AddSelection(5, 5, 3, 3);
自定义选择外观
Spread控件为选择提供了一个默认的外观。你可以改变选择的外观,包括背景色、前景色和字体等。你还可以使用ShowRowSelector属性指定一个行选择器图标。
默认情况下,Spread控件使用选择renderer设置的外观。当选择了一些内容时,renderer将会改变选择的背景色。在不使用该renderer的情况下,你可以为选择的背景和文本指定特定的颜色。或者你还可以同时使用renderer的外观以及你自定义的颜色。你还可以指定不使用外观对选择进行高亮提示。
下图依次展示了使用默认renderer样式时被选择单元格的外观,使用设置颜色时被选择单元格的外观,和既使用renderer样式,又使用自定义颜色时单元格的外观。
如果没有为选择设置颜色,则默认颜色是Color.FromArgb(100, SystemColors.Highlight)。
被选择单元格的绘制方式 取决于SheetView类中的不同属性。
视图属性 |
描述 |
SelectionBackColor |
确定选择的背景色 |
SelectionForeColor |
确定选择的文本颜色 |
SelectionStyle |
确定选择的样式(使用自定义颜色,定制的renderer或者两者均使用) |
SelectionFont |
确定指定文本的字体 |
当SelectionStyle是SelectionColors时,单元格使用SelectionBackColor和SelectionForeColor设置代替单元格ForeColor和BackColor属性设置进行绘制。当SelectionStyle是SelectionRenderer时,单元格使用单元格的ForeColor 和 BackColor属性的设置进行绘制。然后一个半透明的层绘制于单元格之上。该半透明层使用了系统的高亮颜色(Alpha值为100)实现。
Brush selectionBrush = new SolidBrush(Color.FromArgb(100, SystemColors.Highlight)); g.FillRectangle(selectionBrush, x, y, width, height);
如果你需要更多的信息,请参阅SelectionStyles 枚举和ISelectionRenderer接口。如果你需要关于选择设置的更多信息,请参阅FpSpread类中的SelectionRenderer属性和RetainSelectionBlock属性.
下面的示例代码使用renderer设置和颜色对选择的高亮显示进行了设置。
// Use the selection renderer and colors. fpSpread1.Sheets[0].SelectionStyle = FarPoint.Win.Spread.SelectionStyles.Both; // Set the background and text colors.fpSpread1.Sheets[0].SelectionBackColor = System.Drawing.Color.AliceBlue; fpSpread1.Sheets[0].SelectionForeColor = System.Drawing.Color.Navy;
自定义撤消和恢复操作
你可以把撤销/恢复功能添加到你的应用中,用来撤销表单中被终端用户执行的各种操作。你可以使用UndoAction类和另外一些特定的类来满足不同用户的行为。另外还有一个管理类用来记录最终用户的可以撤销和恢复的行为。
SpreadView类和FpSpread类拥有AllowUndo和UndoManager属性,这些属性用来打开和关闭撤销/恢复特性,并返回UndoManager给相应的SpreadView实例。每一个SpreadView拥有自己的UndoManager。
行为分配
UndoAction类是一个继承自Action的抽象类,该类中添加了一些新方法:Undo 和 SaveUndoState。同时,它从Action类中继承了PerformAction方法。
你可以在SaveUndoState中添加代码用来存储撤销状态的相关信息(类的成员变量)。你可以在PerformAction中添加代码来执行行为。你可以在Undo中添加代码来恢复行为(使用变量中的撤销状态信息)。
每一个继承自UndoAction的类被设计为仅执行一个指定行为(例如,编辑一个单元格,调整列大小,移动一个区域等),并撤销该行为。与执行该行为相关的信息需要被传入该对象的构造函数中,并且所有与撤销该行为有关的信息需要被存储在SaveUndoState的实现中。一旦 UndoAction对象被创建,指定行为的变量将被固定(根据传入构造函数中的变量)。例如,编辑sheet1中的A1单元格,并将值改变为“test”,将列B调整为24像素,将区域C4:F6移动到A1:D:3等。并且只能使用指定的方法执行指定的行为。
管理行为
UndoManager类管理撤销栈和恢复栈,它保存着执行的行为和恢复的记录及其顺序。UndoAction必须要传入到UndoManager中的PerformUndoAction方法,用来按顺序执行该行为,并被UndoManager撤销。当这种情况发生时,UndoManager将UndoAction压进撤销栈,并调用UndoAction中的PerformAction方法,然后CanUndo方法返回true(表明有行为需要撤销)。如果CanUndo返回的是false,这意味着撤销栈是空的,并没有行为准备好被撤销。如果你的应用拥有编辑菜单,你可以使用该方法使编辑菜单中的撤销菜单失效。
当一个行为准备撤销时,你可以调用UndoManager中的Undo方法,Undo方法将撤销栈中顶部的行为移动到恢复栈中,并且调用该行为的Undo方法,然后CanRedo方法返回true(表明有行为需要恢复)。
如果CanRedo返回false,这意味着恢复栈是空的,并且没有行为准备好被恢复。如果你的应用拥有编辑菜单,你可能希望使用该方法使编辑菜单中的恢复菜单失效。
当一个行为准备恢复时,你可以调用UndoManager中的Redo方法,Undo方法将恢复栈中最近执行的行为移动到撤销栈中,并且调用行为的Redo方法,然后CanUndo方法返回true(表明有行为需要恢复)。
当你调用UndoManager中的PerformAction方法时,你可以将一个UndoAction对象的序列传给该方法,该方法将执行序列中的每一个行为,并记录每一个行为以及行为被执行的顺序。然后你可以调用Undo方法撤销序列中的一些行为,并且每一个方法可以使用Redo方法来恢复(使用Undo方法可以再次撤销)。
如果你调用PerformAction来执行一个新的行为,在恢复栈中挂起的行为将会被清除,并且CanRedo方法返回false(这意味着一旦你执行了一个新的行为,你将不能够恢复你之前撤销的任何行为)。这就是为什么UndoManager中的PushUndo方法拥有一个标识,当行为被压入撤销栈时来询问恢复栈是否需要被清空。
一些UndoAction类将会替换动作映射中的行为对象,所以这些行为将会通过UndoManager按路径发送并且成为可撤销的。其他UndoAction类将不会成为动作映射的一部分,而是用在SheetView或者SpreadView代码中,使行为成为可撤销的。
其他API补充
输入映射包含新的条目将CTRL+Z 和 CTRL+Y组合键映射为相应的UndoAction和RedoAction行为对象。这些行为调用UndoManager中相应的Undo和Redo方法。
自定义用户界面的图像
你可以自定义多种图像,并通过用户接口选择自定义的图像,应用并替代默认图像。可以自定义的图像包括:
1. 级联(展开和折叠)图标
2. 筛选指示器
3. 排序指示器
4. 行选择器
使用SpreadView类的GetImage 和 SetImage方法来设置用户界面上这些部分的图像。这些图像的仅能在运行时设置,不支持在设计时设置。
如果你需要关于这些方法的一个示例,请参阅下述方法:
1. CollapseImage
2. CollapseImageDisabled
3. ExpandImage
4. ExpandImageDisabled
5. FilterActive
6. FilterActiveDisabled
7. FilterInactive
8. FilterInactiveDisabled
9. RowSelectorImage
10. RowSelectorImageDisabled
11. SortAscendingImage
12. SortAscendingImageDisabled
13. SortDescendingImage
14. SortDescendingImageDisabled
15. SortUnsortedImage
16. SortUnsortedImageDisabled
如果你需要将图像重新设置为Spread默认图像,你仅需要将SetImage方法中的图像值设置为空。
另外一种为筛选指示器和排序指示器设置图像的方法是重写CellTypeColumnHeaderRenderer 类中的 PaintFilterIndicator 和 PaintSortIndicator 方法。
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 7新功能使用指南