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