错误: ′控件不支持该数据类型′. 无论是上述何种情况, 当以任何方式改变 record source 时, 都有消除表格重建的方案. 以下示例代码用列的 Comment 属性保存 control sources 并恢复它们. &;&; 备份各列的 ControlSource with {grid} local nColumnIndex for m.nColumnIndex = 1 to .ColumnCount .Columns(m.nColumnIndex).Comment = .Columns(m.nColumnIndex).ControlSource endfor endwith &;&; 恢复各列的 ControlSource with {grid} local nColumnIndex for m.nColumnIndex = 1 to .ColumnCount if !empty(.Columns(m.nColumnIndex).Comment) .Columns(m.nColumnIndex).ControlSource = .Columns(m.nColumnIndex).Comment endif endfor endwith 上面代码中的 {grid} 是表格对象的引用(如:Thisform.Grid 或 Thisform.Pageframe1.Page1.Grid1). 把这些代码放到表格类的一个方法中是一个不错的主意. 这在设计时因改变 record source 而造成 ControlSource 值丢 失时在表格类的 Init 方法中调它来恢复 control sources 也是一种好办法.
重大注意: 在完全恢复 control sources 前不要执行任何表单上的可视控件或表格的 refreshing. 否则如果你在表格列中 使用了自定义控件时你将会遇到一个错误信息 ′控件不支持该数据类型′. 这是因为正如前面提及的列中可能使用的打乱 了的 control sources 中的不正确的字段类型造成的.
表格自动重构
你是否发现过你的表格的行为不再象你在设计时
设计的那样的情况? 列中的自定义控件丢失? 列, 标题或控件事件中的代 码不再运行? 表格的重构行为会完全移去所有的表格控件和列并用默认的 VFP 控件和属性设置再次重
建表格. 这造成所 有列对象中的所有方法, 属性设置和对象丢失. 列的 CurrentControl 属性重置为默认的文本框控件. 自定义标题丢失. 通 常这是一种不知道表格发生了什么情况的灾难. 下面说明种种原因及解决办法. 1. 表格自己重构总是发生在 RecordSource 别名被关闭后. 如果这是一个视图, 通常在你 requery 视图时重构不会发生. 如果它是一个 SQL 语句, 当你指定另一个 SQL 语句或关闭表格使用的用于保存查询结果的别名时重构就会发生. 当你 使用 SQL Pass-Through 来再次查询数据到表格的 record source 使用的别名时重构也会发生, 即使你任然使用的是视 图. 要避免在刷新表格的 record source 的重构, 你需要在上述的任何表格 record source 刷新前, 指定一个空串 (不是一个 空格 - " ", 而是空串 - "") 到 Record source. 检查你的代码是否正确, 你是否以正确的顺序这样做了, 或其它东西没有 打乱正确的 refreshing 处理顺序. (你可以在表格的 BeforeRowColChange 事件中放入 SET STEP ON 或设置跟踪断点 来跟踪代码). 在 record source 刷新后, 再次指定 record source 到表格. 在此情况下重构不会发生, 但是, 因为指定 r ecord source , 列会发生自动重绑定. 以下是如何用一小点代码来修正这种情况的示例. * 下面保存 control sources ........... {grid}.RecordSource = "" * 执行 record source 的刷新 ........... * 恢复 record source {grid}.RecordSource = "{RecordSourceName}" * 下面恢复列的 control sources ........... 在上面代码中 {grid} 是表格对象的引用, {RecordSourceName} 是用于 record source 的别名或 SQL 语句. 通常情况 下使用 SQL 语句作为 record source 别名会使列的 ControlSource 改变, 因为 VFP 总是改变它来表示为 ′Alias.FieldN ame′格式而不管在设计时只指定了字段名. 以上方法在改变表格的 SQL 语句时也是有用的. 重要注意: 在语句 ′RecordSource=""′ 后到完全恢复 control source 之间, 不要执行任何表单上的可视控件或表格的 r efreshing. 否则如果你在表格列中使用了自定义控件, 你将可能收到一个 ′控件不支持该数据类型′ 错误.
另一种避免表格重构的方法