在VB.net中将第二个表单返回输入焦点设置为第一个表单

时间:2013-04-16 23:39:15

标签: vb.net forms

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

我有3个表格 表格A用户将要处理的表格; 表格B用于选择要显示的表格C的菜单; 表格C是数据库中数据的“快速列表”,以帮助输入表格A.在会话期间可以显示这些表格C中的几个。

  • 在表格A上工作的用户可以按下control-Q,这将显示表格B的菜单。

  • 控制自动转到表格B,用户按下一个键,弹出所需的表格C,表格B关闭。

  • 控件传递给表格C,它是“活动”表格。

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

一切正常,但我最终将Form C作为活动表单。

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

2 个答案:

答案 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