是使用表格的 BeforeRowColChange 事件. BeforeRowColChange 事件在每次表格将要重构 时被激发. 它在包括表格别名关闭时, SQL Pass-Through 游标重获取等时发生. 无论表格是否可见, 具有焦点及表格的 配置. 最令人惊奇的是放置 NODEFAULT 到该事件中以使数据改变时避免表格重构. 但是, 在此情况下表格会显示不可思 议的错误行为. thisform.GridRefreshing = .T. &;&; 告诉所有表格控件 &;&; 将重新获取表格数据 ... 执行数据
查询 thisform.Grid.RecordSource = thisform.Grid.RecordSource thisform.Refresh &;&; 或表格刷新 DOEVENTS &;&; 如果需要 - 只测试不要该命令
&;&;
在此时表格停止自己重构> thisform.GridRefreshing = .F. 在表格类的 BeforeRowColChange 事件中放入以下代码: if PEMStatus(thisform,"GridRefreshing",5) AND thisform.GridRefreshing nodefault return endif 如果你放置上面代码到表格类中这样该功能一般性的, 包括使 GridRefreshing 属性作为你的表格类的属性. 有时要求设 置焦点到表格外然后再设置焦点回到表格, 因为表格中的当前单元会在使用该方法来避免表格重构时显示星号 (′****** *′). 不幸的是, 没有办法知道 BeforeRowColChange 事件被调用的原因是因为它的重构还是移动表格单元格的焦点或是表格 获得焦点时. 就象在示例中一样使用一个标记. 如果你有时间, 你也可以生成一个使用透明的形状控件复盖在表格上的表 格类来捕捉所有鼠标事件. 采用该方法表格将可以知道表格的 BeforeRowColChange 激发的原因. 该方法也可以捕捉 Ke yPress 事件 (最好是设置表单的 KeyPreview=.T.). 最后, 表格应该放到容器中来捕捉表格得到焦点时刻 (BeforeRowCol Change 也将在表格得到焦点时激发). 两种方法都有一个重大的缺点: 要求在所有造成重构的地方放置代码. 当这样的地方位于多个表单和类中时, 如, 用 SQL Pass-Through 功能重新查询一些别名的时, 要定位所有的这些地方是困难的并且它们要求一个表格的引用来避免重构. 它有时也会造成不希望的列的自动再绑定. 表格
常用于显示视图中的动态数据, 因此它在 requiry 时会被其它的数据刷新. 表格的重构在视图 requiry 时不会发生. 但是, 当移动(升级)应用程序到使用远程视图时程序员常常决定使用 SQL Pass Through 功能来处理数据. 在这样的情况下各个被 SQL Pass-Through 使用的别名的 requery 将造成重构. 因此,
程序 员在这里的主要错误也只是 requery 视图并象以前一样放入代码到这里. 它是一条单一的命令, 因此程序员常常在许多地 方放入这样的命令而没有注意到这样做的不正确之处. 在升级到使用 SQL Pass-Through 功能时所有 requery 语句应该 用适当的命令替换. 另外, 在发现重构行为时, 程序员开始找所有该别名 requery 的地方. 它可能交叉地存在于表单和类 中的多个地方, 这就成为一个大的问题. 诀窍: 放置数据 requery, 关闭, 打开和重打开 (以及其它所有与数据在关的动作) 在一个地方 - 类的方法或函数中, 并用该类的对象引用来调用适当的功能. 总是假设所有数据功能会在今后的一些附加 的代码中进行 requery, 即使当它只是一个简单的视图的 requery. 使用这种方法将有助于你在你需要修改某些东西而查 找所有数据动作的地方时节约时间. 表格重构是当其出现时你不能避免的这种情况之一. 例如, 创建一个具有所有必需的, 处理它显示的
数据的方法的表格类. 然后使用表格类的对象引用. 这样在所有地方的数据刷新请求将成为一个单一的功 能调用. 好了, 也许你很少创建一个有如此需求的应用程序… 因表格重构行为的失败, 程序员有时创建并维护表格使用的 Record Source 的游标, 然后刷新用删除和复制来刷新这样 的游标. 在你已经有了这样的游标的情况下, 从游标中删除所有