2014-10-01 41 views
3

我会尽力解释这一点,我可以。行事意外

我有Windows窗体应用程序,其中包含众多的形式。打开的第一个表格 是一种非模态形式,充当命令形式来发布各种格式的 底层预留程序。第二种形式也打开这基本上是我的 主要形式的应用程序。该表单包含多个复选框,以运行修改预订程序的方法 。这种形式也是无模式的。 被选中的每个框同时运行,并执行删除,更改和添加到下面的 res程序的方法。可以在任何给定时间检查各种盒子。下面是代码 处理复选框:

Private Sub frmOWTMain_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp 

    If e.KeyCode = Keys.Enter Then 
     Me.Hide() 'here i want to hide the OWTMain form 
     Call ckforPNR() 
     If Me.cbPricing.Checked Then 
      Call doPricing() 
      Me.cbPricing.Checked = false 
     End If 
     If Me.cbUdids.Checked Then 
      frmUdids.Show() 
      Me.cbUdids.Checked = False 
     End If 
     If Me.cbMod.Checked Then 
      Call doModUdids() 
     End If 
     If Me.cbFare.Checked Then 
      Call doFareSavings() 
      Me.cbFare.Checked = False 
     End If 
    End If 
    Me.show() 'This is the problem. This runs during method calls. All I'm 
     'looking to do is re display the OWTMain form. 
End Sub 

在这一点上,我想再次显示上述OWTMain形式。这是我遇到问题时的 。如您所见,许多方法被称为 ,其中涉及向用户显示其他表单。我不希望这些 表单中的任何一个是模态的,因为我希望原始的第一个打开的表单仍然是 能够向res程序发出命令以查看其他表单所需的信息。

这里是调用的一些方法的例子:

Private Sub doPricing() 
    Dim myPrice As New Pricing 'a call to another class that handles pricing 
    If myPrice.getTQT = False Then 
     frmAddPricing.ShowDialog() 'showing new forms 
    Else 
     frmCurPricing.ShowDialog() 
    End If 
End Sub 

Private Sub doFareSavings() 
    Dim myPrice As New Pricing 
    If myPrice.checkForFS = False Then 
     frmFS.ShowDialog() 'showing new forms 
    End If 
    If myPrice.checkForFS = True Then 
     frmFSVerify.ShowDialog() 
    End If 
End Sub 

当我打电话任何这些方法的形式OWTMain显示过早而从被调用的方法等 形式仍在运行。我预计顶部的代码按照调用顺序运行 ,但事实并非如此。我只想在所有代码运行后重新显示OWTMain 表单。如果没有 创建大量代码来缩小窗口的打开和关闭,我一直无法解决这个问题。

任何帮助,这将不胜感激。谢谢。 John

+0

在我看来,你应该从该事件处理程序中删除该代码的绝大部分。无模式地显示第一个表单,即通过调用Show来处理它的FormClosed事件。在该事件处理程序中,决定下一步该做什么。为每个其他形式做这件事。在最后一个提出了FormClosed事件后,再次显示原始表单。 – jmcilhinney 2014-10-01 06:20:33

+0

如果你看看第一个块:'如果chkbox检查//执行某些操作//取消选中它' - 这就是按钮的工作原理。因为它不适合于[SRP](http://en.wikipedia.org/wiki/Single_responsibility_principle) – Plutonix 2014-10-01 11:27:38

回答

0

这将检查是否所有子窗体都关闭,然后重新显示主窗体。

删除exitsing me.show()

Public Sub ReShowMainForm() 
    ' add all sub forms to this check 
    if frmFS.Visible = false andalso 
     frmUdids.Visible = false andalso 
     frmFSVerify.Visble = false then 
     Me.Show 
    End If 
End Sub 

变化xyzForm.Show到xyzForm.Show(我),使可作为父到子窗体的主要形式。

处理每个子形式FormClosed事件,并添加以下代码

DirectCast(me.parent, frmOWTMain).ReShowMainForm() 
+0

我不太明白你在这一行中的含义:“将xyzForm.Show更改为xyzForm(me)使主窗体成为子窗体的父窗体xyzForm是主窗体还是它适用于我需要显示的所有其他窗体?将会有大约10个单独的方法按框的顺序运行,形式。谢谢,我真的很感激你的时间。约翰 – user2774415 2014-10-02 18:42:10

+0

对不起。我错过了至关重要的细节。我补充说,将所有ShowDialog调用添加参数(Me)。例如:frmAddPricing.ShowDialog(Me) – schudel 2014-10-02 20:21:59

+0

schudel,非常感谢。这是我采取的方向,但不是单独检查每个表单的可见性,而是通过所有打开的表单(除了起始表单)循环,并检查每个表单的可见属性。然后我打开主窗体。再次,谢谢。在尝试一周后,你的代码让我得到了一个解决方案。非常感谢。 – user2774415 2014-10-03 21:11:36