在VB.net中使第二个表单将输入焦点返回到第一个表单

在VB.net中使第二个表单将输入焦点返回到第一个表单,vb.net,forms,Vb.net,Forms,我在网上搜索了这个问题的答案,但没有找到。这似乎是一个很常见的问题,我很困惑,什么也找不到 我有三张表格 表单A用户将使用的表单; 表格B用于选择要显示的表格C的菜单; 表格C数据库中的数据“快速列表”,用于帮助输入表格a。在会话期间,可以显示其中的几个表格C 用户在处理表单A时,可以按control-Q,该按钮将显示菜单表单B 控件自动传递到表单B,用户按下一个键,所需的表单C弹出,表单B关闭 控件传递给窗体C,它是“活动”窗体 表格C上没有要填写的内容,所以我想自动返回到表格A上的最后一

我在网上搜索了这个问题的答案,但没有找到。这似乎是一个很常见的问题,我很困惑,什么也找不到

我有三张表格 表单A用户将使用的表单; 表格B用于选择要显示的表格C的菜单; 表格C数据库中的数据“快速列表”,用于帮助输入表格a。在会话期间,可以显示其中的几个表格C

  • 用户在处理表单A时,可以按control-Q,该按钮将显示菜单表单B

  • 控件自动传递到表单B,用户按下一个键,所需的表单C弹出,表单B关闭

  • 控件传递给窗体C,它是“活动”窗体

表格C上没有要填写的内容,所以我想自动返回到表格A上的最后一个活动控件

一切都很好,但我最终还是以形式C作为活动形式


如何将控件强制返回到表单A上的最后一个活动控件?

好的,我知道了。还有几个问题需要解决。不确定这是否是最好的方法,但确实有效

第一个问题是能够从其他表单中引用希望获得焦点的表单。我重载了表单B和表单C的“show”事件,以便能够传递原始调用表单。当我从表格A调用表格B时,我提供了对表格A的引用。然后当我调用表格C时,我再次传递了对表格A的引用。那时,表格B和表格C都知道发起者是谁

我试图将焦点设置回表格C中的表格A。因此,在表格B和表格C中,我都会设置一个变量(Dim'callingform'作为表格)。在表格B和C中,我使用了以下内容:

暗淡的呼唤形式

重载子显示(ByVal f1作为表单)

调用形式=f1

因此,表格B和表格C中的每一个都引用了最初的表格a,最终获得焦点

但是你不能引用带有这个变量的表单。以下是对表格的适当引用,“焦点”是更改焦点的方法

CType(callingform,windows.forms.form.focus())

这句话似乎很直截了当,但我用错了地方。我在Form C的“Load”事件结束时使用了该语句。问题是Form C尚未获得焦点,因此执行该语句将在Form C实际显示时被重写。我当时不知道,但现在知道了,直到加载事件之后,焦点才转移到新表单。因此,如果你把这句话放在形式C‘GotFocus’事件中,它就像一个符咒

在考虑了一段时间之后,我决定可以从任何地方调用表单C,而不应该决定应该在哪里设置焦点。应该由决定显示表格C的人决定

因此,我在表格B的菜单选择代码末尾添加了以下内容:

表格C.显示(表格A)'显示表格C并传递原始表格)

CType(formA,windows.forms.form).focus()'将焦点更改为原始表单formA

formB.Close(实际上是-me.Close)-“关闭菜单表单,formB


(旁白:我真的不明白为什么需要“ctype”。我将表单作为“表单”传递,并将变量“callingform”定义为表单。我希望能够只说callingform.focus())

以下是我回答的相关代码

部分代码: 表格A(原调用表格)

在快速列表菜单表单中(原始表单B)

最后是“快速列表”的代码——表格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

感谢您花时间发布此问题和答案。你会考虑发布源代码吗?我发现这有点难以理解,代码清单可能会让事情更清楚。
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
  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