Navigation VFP-在栅格中重新定位

Navigation VFP-在栅格中重新定位,navigation,visual-foxpro,Navigation,Visual Foxpro,网格grdmain有一个recordsource cDetail。cDetail是一个只有两列的游标: 创建光标cDetail(tProd C(16),tValue N(4)) 表单上的按钮可以重新定位到网格中的其他行: cmdPosition.Click() SELECT cDetail GOTO <record> Thisform grdmain.setfocus() cmdPosition.单击() 选择cDetail 后藤 此表单grdmai

网格grdmain有一个recordsource cDetail。cDetail是一个只有两列的游标:

创建光标cDetail(tProd C(16),tValue N(4))

表单上的按钮可以重新定位到网格中的其他行:

cmdPosition.Click()
     SELECT cDetail
     GOTO  <record>
     Thisform grdmain.setfocus()
cmdPosition.单击()
选择cDetail
后藤
此表单grdmain.setfocus()
。这个很好用

现在,我希望能够通过在网格的Column2.text1中输入合适的值来重新定位网格中的一行

在Column2.text1.valid()方法中包含了类似的代码(不包括Setfocus()),但所选单元格仍在同一行上-我一定是做错了什么


谢谢。Andrew

要想做你想做的事情,你必须先将焦点从网格上移开。您当前以交互方式关注的行将始终覆盖任何手动转到命令。您还需要将代码放入网格列文本框的LostFocus事件处理程序中(以避免“无法从When,Valid”错误中调用SetFocus)

假设此代码位于“Column2.Text1.LostFocus”中。对于这个例子,我在表单上有一个名为“command1”的按钮。此外,我将任意地转到第2排

thisform.command1.SetFocus()
GOTO  2
thisform.grdmain.SetFocus()

要做你想做的事情,你必须先把焦点从网格上移开。您当前以交互方式关注的行将始终覆盖任何手动转到命令。您还需要将代码放入网格列文本框的LostFocus事件处理程序中(以避免“无法从When,Valid”错误中调用SetFocus)

假设此代码位于“Column2.Text1.LostFocus”中。对于这个例子,我在表单上有一个名为“command1”的按钮。此外,我将任意地转到第2排

thisform.command1.SetFocus()
GOTO  2
thisform.grdmain.SetFocus()

我看不到您在其中指定要实际getfocus()或setfocus()的列和行的代码。上面的代码只是将焦点设置为网格本身。谢谢,Hank。确实,代码只指定网格中要接收焦点的行。后藤就是这样做的。如果需要在网格中同时指定行和列,则顺序可以是:GOTO Thisform.grdmain.Column2.text1.setfocus()。实际情况是,当从命令按钮调用时,此代码确实会将焦点设置为网格中所需的行(和列,如果需要)。但是当从column2.text.valid()方法中调用时,它是无效的,对于行来说肯定是无效的。这就是我想要实现的。您是否尝试过使用
Column2.Text1.LostFocus
事件?谢谢Supersnake。是,我已尝试将代码放入Column2.Text1.LostFocus()中。但这不会在另一行重新定位;如果对你有用的话,我一定是做错了什么!您是否有一个代码示例,其中更改column2.text1中的值会导致焦点位于网格中的另一行。非常感谢,我没有看到您在其中指定要实际获取焦点()或设置焦点()的列和行的代码。上面的代码只是将焦点设置为网格本身。谢谢,Hank。确实,代码只指定网格中要接收焦点的行。后藤就是这样做的。如果需要在网格中同时指定行和列,则顺序可以是:GOTO Thisform.grdmain.Column2.text1.setfocus()。实际情况是,当从命令按钮调用时,此代码确实会将焦点设置为网格中所需的行(和列,如果需要)。但是当从column2.text.valid()方法中调用时,它是无效的,对于行来说肯定是无效的。这就是我想要实现的。您是否尝试过使用
Column2.Text1.LostFocus
事件?谢谢Supersnake。是,我已尝试将代码放入Column2.Text1.LostFocus()中。但这不会在另一行重新定位;如果对你有用的话,我一定是做错了什么!您是否有一个代码示例,其中更改column2.text1中的值会导致焦点位于网格中的另一行。我会非常感激史蒂夫把我揍了一顿!更多信息:VFP网格在包含控件的操作过程中尽最大努力保持ActiveRow和RelativeRow的完整性。如果您仔细查看它,您将看到
RECNO()
确实发生了变化,但只要
Valid
完成,它就会返回到以前的值。请注意,上面的
LostFocus
可能并不总是在您需要时触发。例如,上下浏览
Column2
不会导致
Column2.Text1
失去焦点。谢谢Steve。您对按钮“Command1”的建议与原始问题中的代码几乎相同。然而,我正在寻找一种解决方案,当在column2.text1中输入值时,它可以在网格中重新定位,而不必按另一个按钮。这可能吗?有人有解决方案吗?我上面发布的代码是针对第2列中文本框的LostFocus的。所以不需要按按钮。您确实需要将对“thisform.command1”的引用替换为表单上实际存在的某个按钮。(抱歉延迟)谢谢Steve。是的,你说得对。我检测到Column2.Text1.valid()中的网格行需要更改。如果我随后设置一个标志,告诉Column2.text1.lostfocus()执行setfocus()命令,那么就可以了。调用setfocus()似乎很奇怪,但实际上从未到达目的地,但它可以工作!或者,您可以在afterrowcolchange()方法中执行GOTO指令。这样你就不需要发出setfocus()了。史蒂夫比我更厉害!更多信息:VFP网格在包含控件的操作过程中尽最大努力保持ActiveRow和RelativeRow的完整性。如果您仔细查看它,您将看到
RECNO()
确实发生了变化,但只要
Valid
完成,它就会返回到以前的值。请注意,上面的
LostFocus
可能并不总是在您需要时触发。例如,上下导航
Column2