理解单元格类型基本信息
Spread支持几十种单元格类型,如复选框单元格、日期时间单元格、或者一个简单的文本单元格。单元格类型可以对单独的单元格、列、行、一个单元格区域,甚至是整个表单进行设置。单元格类型决定了用户与单元格交互的方式,包括如何对数据进行访问、显示和校验等。单元格类型为单元格定义了一个editor用以处理输入数据,一个formatter用以分析和格式化数据,还有一个render用以控制单元格的数据如何显示。
Editor,Formatter,以及 Renderer
一个单元格类型包括一个editor,一个renderer,以及一个formatter。editor负责在编辑模式中,创建和控制单元格编辑控件。formatter负责转换单元格的值,转化为文本或者从文本格式进行 转换,(举例来说,当获取或者设置一个单元格的Text属性)。renderer负责绘制单元格(此时单元格不处于编辑模式)。
在大多数情况下,你想要此单元格无论是否在编辑模式,在外观上来看都是一样。在这种情况下,你只需要创建单一的单元格类型,并且将其设置为单元格的CellType属性。这种单一的单元格类型被用来创建单元格的editor,renderer,以及formatter。如果你想要根据是不是处于编辑模式来进行不同的外观显示,那么你就要创建两种单元格类型并且将一种单元格作为单元格editor的类型,另外一种设为单元格renderer的类型。你可能也想将一种单元格类型赋给单元格formatter. 更多相关信息,请参阅ICellType 接口。
EditBaseCellType
单元格编辑的设计需要单元格类型返回单元格之上的editor控件。单元格的editor控件可以以文本作为基础 (例如文本框)或者以图形为基础(例如复选框)。editor控件可以进行下拉列表(例如组合框)或者弹出对话框(例如日期选择器)。EditBaseCellType类是这样一种类,它是内置的以文本为基础的单元格类型(比如,一般信息,文本,数字,日期,等等)的来源。这个类也可以导出文本类型的自定义单元格类型。ISubEditor接口可以用来将以文本为基础的单元格editor和下拉列表联系起来(例如复选框)或者弹出对话框(例如日期/选择框)。数据模型可以持有数据,包括颜色。单元格类型常常在数据模型中传递原始数据。
头部单元格
头部的单元格是可以渲染的,但是是不可编辑的。虽然你可以将一种单元格类型赋给行头或者列头的单元格,但是单元格类型仅仅用来描绘。在单元格中,编辑操作被限制在数据区域的单元格中。如果你想将一些可编辑的部件像 表头那样进行操作,你可以将列头隐藏(或者关闭) ,将表单的第一行冻结,然后使用冻结的行作为你的伪头部单元格。
对象层次
Spread控件中的对象,例如表单、行和单元格等,有很多格式和其他的属性继承自它的 “父母”。一个单元格可以从一个表单中继承格式,例如背景颜色。如果你对一列中所有单元格的文本对齐方式进行了设置,则单元格同样继承了该对齐方式。由于对象继承,很多属性和方法可以使用不同的方式应用在表单的不同部分。
你可以重载一个独立的单元格所继承的格式,但对象默认继承父类的属性。所以在一个给定的上下文中,任何一个对象的设置综合了应用在其上的父类属性。例如,你可以为一个单元格在单元格级别上设置文本颜色,但它可能从其所在行继承了垂直对齐方式,从其所在列继承了边界属性,并从其所在表单继承了背景颜色。由于背景颜色可能在这些多个层次上被设置,因此必须采用某些优先级规则。
越靠近单元格级别,优先级越高。所以如果你在单元格中设置了背景颜色,那么从父类继承而来的设置将会被覆盖。请参阅如下的属性优先级列表。越靠近单元格(数字越小),优先级越高。
1. 单元格
2. 行
3. 列
4. 交替行
5. 表单
6. 控件
下面的示例代码把表单的背景设为黄色,第二行和第三行的背景设为绿色,第三列的背景设为蓝色,第三行第三列的单元格背景设为红色。可以从效果图上看出表单、列、行和单元格之间的优先级关系。
fpSpread1.Sheets[0].DefaultStyle.BackColor = Color.Yellow;fpSpread1.Sheets[0].Rows[1].BackColor = Color.Green;fpSpread1.Sheets[0].Rows[2].BackColor = Color.Green;fpSpread1.Sheets[0].Columns[2].BackColor = Color.Blue;fpSpread1.Sheets[0].Cells[2,2].BackColor = Color.Red;
自定义弹出的日期时间控件
如果你在编辑模式下按下F4键或者双击的日期时间单元格,一个弹出日历(或者弹出时钟)就会显示。如果你将格式设置为TimeOnly,那么就会显示一个时钟控件。你在日历中选择的日期(或者在时钟中选择的时间)被放置在日期时间单元格中。如果你想要显示日期与时间,你可以在日历控制中点击“Today”;如果你想要显示时间,你可以在时钟控制里点击“Now”。
弹出日历控件 | 弹出时钟控件 |
你可以指定日期和月份的常规名称和缩写名称,并且可以指定控件底部按钮的文本。使用 DateTimeCellType类的SetCalendarText 方法对它们进行设置。
请注意按钮中心显示的文本。请尽量把将文本长度限制为8或9个字符。虽然按钮可以显示10个字符,但第一个和最后一个字符将会非常接近按钮的边缘。
当使用控件时,仅需点击确定或取消按钮关闭控件。“Today”(或者“Now”)按钮可以简单地将单元格中的值设置为当前日期(或时间)。
更多有关日期和时间单元格格式的设置,请参阅DateTimeFormat 枚举类型。
下面的示例代码设置按钮的文本,并且在数组列表中指定日期和月份的名称。
FarPoint.Win.Spread.CellType.DateTimeCellType datecell = new FarPoint.Win.Spread.CellType.DateTimeCellType(); string[] daynames = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; string[] months = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; string[] dayabbrev = {"Su","My","Ty","Wy","Th","Fy","Sy"};string[] mthabbrev = {"Jy","Fy","Mh","Al","My","Jn","Jl","At","Sr","Or","Nr","Dr"};string okbuttn = "Fine";string cancelb = "Quit";datecell.DateTimeFormat = FarPoint.Win.Spread.CellType.DateTimeFormat.UserDefined;datecell.UserDefinedFormat = "dddd MMMM d, yyyy";datecell.SetCalendarText(daynames,months,dayabbrev,mthabbrev,okbuttn, cancelb); fpSpread1.ActiveSheet.Cells[1, 1].CellType = datecell;fpSpread1.ActiveSheet.Cells[1, 1].Value = System.DateTime.Now;fpSpread1.ActiveSheet.Columns[1].Width = 130;
自定义自动完成(预先键入)
你可以根据用户在单元格中的输入进行自动完成(预先输入),使用IAutoCompleteSupport 接口及其属性以便在可编辑单元格中提供自动完成的特性。
基本上有两个属性可以进行设置。第一个你可以设置自动完成的模式,如上图所示。这个选项包括提示一个可能的单词或一个可能的自动完成的下拉列表,或是两者都有,又或是两者都没有。
第二个属性,你可以设置自动完成的来源。这个来源被当做是自动完成的项目的列表。你可以创建一个自定义源并且定义你自己的项目清单,或者你可以设置不同的系统资源为源。接口中有两种属性提供对自定义源的设置。第一个是为自定义源设置可能的候选选项。第二个是设置是否使用此列中的其他单元格的数值列表填充该列表。要使用该列的单元格中的数据,例如,你可以设置源为自定义源,然后开启自动补齐。如果条目在单元格的上面或者下面没有空白的单元格间隔,那么自动补齐仅仅是向自定义源中添加项目。
想要查看上面图片背后的代码,请参阅与产品一同安装的SpreadWinDemo示例。
使用子编辑器
对于几种可编辑的单元格类型,当你点击单元格的内部时,就会显示一个编辑器。你可以扩展这个简单的行编辑器,并且提供一个自定义用户界面 (为用户提供若干的设置来辅助用户进行便捷输入) 这个接口的其他层级是受子控制器或单元格编辑器的editor控制的。例如,当你选择日期时间单元格时,你可以向用户可以提供一个日历以便选择一个日期。这个日历控件将被称为子编辑器。
创建一个子编辑器
你可以创建你自己的子编辑器,当此操作完成时,此编辑器就会显示。
- 通过点击F4键
- 通过在编辑模式中双击单元格
- 通过点击下拉按钮(当DropDownButton属性被设为“True”时)
创建你自己的子编辑器的步骤是:
1) 为一个子编辑器创建一个新的Form类。
2) 对这个你刚创建的Form实现ISubEditor接口。
3) 对调用函数设置子编辑器(SubEditor属性)
关于子编辑器的示例,请参阅上面“自定义弹出的日期时间控件”,这里日历子编辑器在日期时间单元格中可用。
禁用子编辑器
在可编辑单元格类型中,当你点击单元格内部时,就会默认地显示一个子编辑器。但是有的时候你可能想禁用这些子编辑器。例如,在日期时间单元格中,你可能想要禁止弹出的日历控件; 在数字单元格中你可能想要禁止弹出的计算器控件。
要禁用子编辑器,你可以在SubEditorOpening事件中设置e.Cancel为“True”:
private void FpSpread1_SubEditorOpening(object sender, FarPoint.Win.Spread.SubEditorOpeningEventArgs e) { e.Cancel = true;}
创建自定义的单元格类型
你可以通过创建一个继承自已存在的单元格类型的子类(就是说要重载这个类中的每一个方法)来创建你自己的单元格类型。如果自定义单元格类型要使用剪贴板或者要使用导出到Excel的方法,那么自定义单元格类应当被标记为“Serializable”。
Spread演示事例中的自定义编辑器示例(Spread for Windows Forms 5\samples folder)显示了如何使用控件使之成为单元格editor。示例文件夹中的那个“FarOut!”示例显示了自定义单元格类型。
附:Spread for Windows Forms高级主题系列文章
相关阅读: