需要在DBGrid双击后更新文件

时间:2014-10-08 23:18:26

标签: delphi double-click dbgrid

我似乎对此有一个心理障碍。

我需要将最近的更改保存到记录中。我正在使用" New" "编辑" "邮政" "接着"等等,但是当用户双击DBGrid时,由于DBGrid选择已将数据库光标移动到所选记录,现在进行更改已为时已晚。

我无法使用AutoUpdate,因为可能已更改的数据不是用户直接输入的数据,而是一直在变化的值。

我会尝试更好地描述它:当用户正在阅读测试页面时,计时器正在倒计时或向上计数。当他们点击"下一步"或"先前"按钮我可以保存定时器设置。但是,如果他们双击DBGrid我无法在选择移动到单击记录之前先更改当前记录。

我尝试使用

Procedure TForm1.tblTestOnBeforeScroll(...
begin
  tblTest.Edit;
  tblTest.FieldByName('TimerCt').AsInteger:=ClockCtr;
  tblTest.Post;
end;

但是,这并没有让人惊讶地崩溃了数据库,但我想在尝试这里之前我会尝试一下。

我如何处理当前记录?如果可能的话,我不想禁止双击,因为它对用户来说似乎很好看和直观。

2 个答案:

答案 0 :(得分:0)

我担心你在DBGrid上做的事情在概念行动中是错误的。 关键点是DBGrid是一种数据感知控件。所以你在它上面所做的一切都必须基于它的数据源,然后是它的数据集。

TDBgrid上有一个DblClick事件。但是你仍然必须检查它的数据集以查看哪些记录是活动的。

上面显示的代码清楚地引导您进入无限循环。

当您进行滚动时,dbgrid将调用OnBeforeScroll事件,移动活动记录 并调用OnAfterScroll。 OnBeforeScroll代码执行数据更新。然后dbgrid中止其操作数据更改的原因。然后在数据更新后,它尝试再次滚动,并再次发生数据更改。无尽的循环发生在这里。

最好的考虑

答案 1 :(得分:0)

如果我误解你,请提前道歉,但在我看来,无论是你的问题的前提是错误的还是有相关的东西,你都没有告诉我们你在做什么。请尝试以下方法:

  1. 如果您还没有,请暂时将DBNavigator添加到表单并将其连接到与DBGrid相同的DataSource。这样做的目的是让你更清楚地看到发生了什么。

  2. 然后,在DBGrid的选项中,将dgEditing设置为True。

  3. 最后,注释掉或禁用您的BeforeScroll处理程序,保存并运行您的程序。

  4. 现在,在DBGrid的某个单元格中单击一次,其中包含一个可以更改的值。再次单击它以便它选择单元格中的值而不是单元格本身。

  5. 对单元格值进行一些更改,但暂时不做任何其他操作。您应该注意到a)DBGrid的当前记录指示器已从黑色三角形变为I-Beam图形,如[和b]现在已启用DBNavigator的勾选和交叉按钮。

    < / LI>
  6. 现在,如果没有在表单上执行任何其他操作,请单击DBGrid的另一行。您应该发现a)保存了对步骤5中当前记录的更改,并且b)当前行指示符恢复为黑色三角形,并且DBNav的勾选和交叉按钮被禁用。

  7. (如果你没有得到我刚才描述的行为,请创建一个最小的新项目,然后尝试相反,因为你在现有项目中做出的其他一些改变可能会干扰它。)

    我在5&amp; 6是DBGrid的默认行为,就我理解你的q而言,这似乎是你想要实现的行为。如果这不是您想要的行为,请准确解释您的需求有何不同。我不清楚用户双击网格的位置是否进入q,除了该操作可能会移动数据集的光标(如果dbl-click位于与当前行不同的行上),而是作为默认的DBGrid在移动数据集的光标之前,行为将保存对当前行的更改,它将自动执行您想要的操作。

    顺便说一句,你说的是“自动更新”吗?你的意思是TDataSource的AutoEdit属性吗?