我在网上搜索了这个答案但找不到。这似乎是一个很常见的问题,我很困惑,没有找到任何东西。
我有3个表格 表格A用户将要处理的表格; 表格B用于选择要显示的表格C的菜单; 表格C是数据库中数据的“快速列表”,以帮助输入表格A.在会话期间可以显示这些表格C中的几个。
在表格A上工作的用户可以按下control-Q,这将显示表格B的菜单。
控制自动转到表格B,用户按下一个键,弹出所需的表格C,表格B关闭。
控件传递给表格C,它是“活动”表格。
表单C上没有任何内容可以填写,所以我想自动返回到表单A上的最后一个活动控件。
一切正常,但我最终将Form C作为活动表单。
如何强制控制回到表单A上的最后一个活动控件?
答案 0 :(得分:0)
好的,我明白了。还有几个问题需要解决。不确定这是否是最佳方式,但确实有效。
第一个问题是能够从其他形式引用您想要关注的表单。我重写了表单B和表单C的'show'事件,以便能够传递原始的调用表单。当我从表格A打电话给表格B时,我提供了对表格A的引用。然后当我打电话给表格C时,我再次将表格A的引用传递给表格A.在那时,表格B和表格C都知道发端人是谁。
我尝试将焦点设置回C表格中的表格A.因此,在表格B和表格C中,我都会设置一个变量(Dim'wallform'作为表格)。在表格B和表格C中,我使用了以下内容:
将调用表格变为表格
重载Sub Show(ByVal f1 As Form)
Callingform = f1
因此,表格B和表格C中的每一个都提到最终获得焦点的原始表格A.
但是你不能用那个变量引用表单。以下是对表单的正确引用,“焦点”是更改焦点的方法。
CType(callingform,windows.forms.form).focus()
这句话似乎很简单,但我试图在错误的地方使用它。我在Form C的'Load'事件结束时使用了该语句。问题在于Form C还没有得到关注,因此执行该语句随后会被覆盖,因为Form C实际上已经显示出来。我当时不知道但现在做,在加载事件之后,Focus不会转移到新表格。因此,如果您将该语句放在Form C'GotFocus'事件中,它就像魅力一样。
在考虑了一段时间之后,我决定可以从任何地方调用Form C,而不应该决定应该设置焦点的位置。应该由谁决定显示表格C来决定。
所以我在表格B的菜单选择代码的末尾添加了以下内容:
FormC.Show(formA)'显示表格C并传递原始表格)
CType(formA,windows.forms.form).focus()'将焦点更改为FormA,即原始表单
formB.Close(实际上是 - me.close) - '关闭菜单表单,FormB
(旁白:我真的不明白为什么'ctype'是必要的。我将表单作为'form'传递,并将变量'callingform'定义为一个表单。我希望能够说出callform。 focus()。)
答案 1 :(得分:0)
以下是我的回答的相关代码。
部分代码: 表格A(原始表格)
If CurMode = Browse Then
'Check for Quick List menu CRTL-Q
If e.Control AndAlso e.KeyCode = Keys.Q Then
' Call the 'Menu form, FormB
CType(Me.MdiParent, frmRECORDmain).ShowQuickListMenu(Me, Me.ActiveControl)
Exit Sub
End If
在快捷列表菜单表格(原始表格B)
Public Class frmQuickListMENU
Dim CallingForm As Form
Dim CallingControl As Control
Dim Selection As String
' This is so that Form B will know who Form A was.
Overloads Sub Show(ByVal f As Form,
ByVal c As Control,
Optional PreSelection As String = "")
CallingForm = f
CallingControl = c
Selection = PreSelection
Show()
End Sub
Private Sub frmQuickListMENU_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.D1, Keys.NumPad1
. .
Case Keys.D3, Keys.NumPad3
. . .
Case Keys.D6, Keys.NumPad6
. . .
' One of 12 Menu choices which will open 1 of 12 Form C's
Case Keys.D7, Keys.NumPad7
Dim frmquickListPHD1 As New frmQuickListPHD()
frmquickListPHD1.MdiParent = MasterParentForm
frmquickListPHD1.StartPosition = FormStartPosition.Manual
frmquickListPHD1.Location = New Point(QLPHD.Left, QLPHD.Top)
' Show Form C
frmquickListPHD1.Show(CallingForm, CallingControl, Me)
End Select
' ************************
' ************************
' THE NEXT LINE IS THE 'MAGIC' I WAS LOOKING FOR
' This line returnbs focus back to the original Form A
' ************************
CType(CallingForm, Windows.Forms.Form).Focus()
Me.Close()
End Sub
Private Sub frmQuickListMENU_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Dim x1 As Integer
x1 = Me.Width
End Sub
End Class
最后是“快速列表”的代码 - 表格C. 但是,由于我已决定更改表单B代码中的焦点而不是表单C代码,因此没有任何表单C代码是相关的。我只是表明它与我原来的帖子一致。
Dim callingform As Form
Dim callingcontrol As Control
Dim MenuForm As Form
' The following was initially required so that the change of focus could be made within this
' Class but I have since changed my mind and the Overload is unnecessary. I only left
' this here so the code would be consistent with my original note. I'll be removing
' thisOverload of the 'Show' event.
Overloads Sub Show(ByVal f1 As Form,
ByVal c As Control,
ByVal f2 As Form)
callingform = f1
MenuForm = f2
callingcontrol = c
Show()
End Sub
Private Sub frmQuickListPHD_Load(sender As Object, e As System.EventArgs) Handles Me.Load
Try
conn.Open()
DA.SelectCommand = New SqlCommand(SQL, conn)
'
'
'
Catch ex As Exception
Console.WriteLine("Error" & ex.ToString)
Finally
conn.Close()
End Try
Me.Height = QLPHD.Height
Me.Width = QLPHD.Width
'
'
' More form layout code
'
'
'
End Sub
End Class