我似乎对此有一个心理障碍。
我需要将最近的更改保存到记录中。我正在使用" New" "编辑" "邮政" "接着"等等,但是当用户双击DBGrid时,由于DBGrid选择已将数据库光标移动到所选记录,现在进行更改已为时已晚。
我无法使用AutoUpdate,因为可能已更改的数据不是用户直接输入的数据,而是一直在变化的值。
我会尝试更好地描述它:当用户正在阅读测试页面时,计时器正在倒计时或向上计数。当他们点击"下一步"或"先前"按钮我可以保存定时器设置。但是,如果他们双击DBGrid我无法在选择移动到单击记录之前先更改当前记录。
我尝试使用
Procedure TForm1.tblTestOnBeforeScroll(...
begin
tblTest.Edit;
tblTest.FieldByName('TimerCt').AsInteger:=ClockCtr;
tblTest.Post;
end;
但是,这并没有让人惊讶地崩溃了数据库,但我想在尝试这里之前我会尝试一下。
我如何处理当前记录?如果可能的话,我不想禁止双击,因为它对用户来说似乎很好看和直观。
答案 0 :(得分:0)
我担心你在DBGrid上做的事情在概念行动中是错误的。 关键点是DBGrid是一种数据感知控件。所以你在它上面所做的一切都必须基于它的数据源,然后是它的数据集。
TDBgrid上有一个DblClick事件。但是你仍然必须检查它的数据集以查看哪些记录是活动的。
上面显示的代码清楚地引导您进入无限循环。
当您进行滚动时,dbgrid将调用OnBeforeScroll事件,移动活动记录 并调用OnAfterScroll。 OnBeforeScroll代码执行数据更新。然后dbgrid中止其操作数据更改的原因。然后在数据更新后,它尝试再次滚动,并再次发生数据更改。无尽的循环发生在这里。
最好的考虑
答案 1 :(得分:0)
如果我误解你,请提前道歉,但在我看来,无论是你的问题的前提是错误的还是有相关的东西,你都没有告诉我们你在做什么。请尝试以下方法:
如果您还没有,请暂时将DBNavigator添加到表单并将其连接到与DBGrid相同的DataSource。这样做的目的是让你更清楚地看到发生了什么。
然后,在DBGrid的选项中,将dgEditing设置为True。
最后,注释掉或禁用您的BeforeScroll处理程序,保存并运行您的程序。
现在,在DBGrid的某个单元格中单击一次,其中包含一个可以更改的值。再次单击它以便它选择单元格中的值而不是单元格本身。
对单元格值进行一些更改,但暂时不做任何其他操作。您应该注意到a)DBGrid的当前记录指示器已从黑色三角形变为I-Beam图形,如[和b]现在已启用DBNavigator的勾选和交叉按钮。
< / LI>现在,如果没有在表单上执行任何其他操作,请单击DBGrid的另一行。您应该发现a)保存了对步骤5中当前记录的更改,并且b)当前行指示符恢复为黑色三角形,并且DBNav的勾选和交叉按钮被禁用。
(如果你没有得到我刚才描述的行为,请创建一个最小的新项目,然后尝试相反,因为你在现有项目中做出的其他一些改变可能会干扰它。)
我在5&amp; 6是DBGrid的默认行为,就我理解你的q而言,这似乎是你想要实现的行为。如果这不是您想要的行为,请准确解释您的需求有何不同。我不清楚用户双击网格的位置是否进入q,除了该操作可能会移动数据集的光标(如果dbl-click位于与当前行不同的行上),而是作为默认的DBGrid在移动数据集的光标之前,行为将保存对当前行的更改,它将自动执行您想要的操作。
顺便说一句,你说的是“自动更新”吗?你的意思是TDataSource的AutoEdit属性吗?