代码之家  ›  专栏  ›  技术社区  ›  Todd Main

返回第一个对话框

  •  0
  • Todd Main  · 技术社区  · 14 年前

    我有一个WinForm,用作与 OK Cancel 按钮。所以:

    Dim sr As New SlideRangeDialog
    Dim dr As Windows.Forms.DialogResult
    dr = sr.ShowDialog
    

    我有一个if/then来查看用户是否按了OK。如果他们按了OK,并且有一个验证错误,我需要他们返回到对话框并修复它。

        If dr = Windows.Forms.DialogResult.OK Then
            Dim mr As Windows.Forms.DialogResult
            mr = MsgBox("Click Yes to fix, No to not fix or Cancel to go " + vbCrLf + _
                        " back to the dialog to fix.", MsgBoxStyle.YesNoCancel)
                    Select Case mr
                        Case Windows.Forms.DialogResult.Yes
                            ''# something
                        Case Windows.Forms.DialogResult.No
                            ''# something more
                        Case Windows.Forms.DialogResult.Cancel
                            ''# RIGHT HERE is where I'm having the problem.
                            ''# I just want "Cancel" to return to the first dialog.
                            sr.DialogResult = Windows.Forms.DialogResult.None
                    End Select
        Else
            ''#other thing
        End If
    

    我要放什么 Case Windows.Forms.DialogResult.Cancel 带我回到第一个对话 sr.DialogResult = Windows.Forms.DialogResult.None 好像不管用?

    我尝试再次提升事件子级(这是从菜单项单击),但这不适用于我使用的技术(vsto功能区)。

    4 回复  |  直到 14 年前
        1
  •  1
  •   Matt Hamilton    14 年前

    尝试将验证逻辑移动到对话框本身或对话框的关闭事件处理程序中。后者可能更容易。我的vb.net技能实际上是不存在的,所以请原谅我,如果这是错误的:

    Dim sr As New SlideRangeDialog 
    Dim dr As Windows.Forms.DialogResult 
    AddHandler dr.Closing, AddressOf SlideRangeDialog_Closing
    dr = sr.ShowDialog 
    

    稍后:

    Public Sub SlideRangeDialog_Closing(Sender As Object, e As CancelEventArgs)
        ' cast Sender as a SlideRangeDialog and check its 
        ' DialogResult property to see if they clicked OK.
    
        ' Your validation goes in here.
        ' If anything fails validation, set e.Cancel to True and the
        ' dialog won't close.
    End Sub
    
        2
  •  1
  •   Preet Sangha    14 年前

    我认为您需要处理好OK(或YesNo等)并在表单中取消,如果验证失败,则不关闭它。

    在用作对话框的窗体上,需要处理按钮中的单击事件。然后在事件处理程序中运行测试以决定是否应关闭窗体。如果是这样,则可以将DialogResult设置为所需的任何值,然后运行我。Close()。

    here 举个例子

    Private Sub OKCmd_Click( _
      ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles OKCmd.Click
    
        If Not ____do_your_test_here____ Then
          MsgBox("Cannot press OK because of blah blah blah . Try again.", MsgBoxStyle.Exclamation)
        Else
          Me.DialogResult = DialogResult.OK
          Me.Close()
        End If
    End Sub
    
        3
  •  0
  •   dexter    14 年前

    由于它的vsto和你有问题使用“正常”的方式在屏幕之间进行通信,为什么你不尝试使用pinvoke代替: 如果您知道如何获取主题窗口的Hwnds,请使用以下代码:

        [DllImport("user32.dll")]
        public static extern bool SetFocus(IntPtr hwnd); 
    
        4
  •  0
  •   Geoffrey    14 年前

    正如preet所说,处理按钮事件中的“me.close”语句最简单。

    您也可以通过将其从按钮事件处理程序中移除并稍后在逻辑树中关闭表单来完成此操作。在我的例子中,我有两种形式。Form1有一个打开Form2的按钮,那个按钮有两个带OK和Cancel按钮的按钮。所以在第二个表单中,您可以使用以下内容:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.DialogResult = Windows.Forms.DialogResult.OK
    End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.DialogResult = Windows.Forms.DialogResult.Cancel
        Me.Dispose()
    End Sub
    

    您应该记住,在使用ShowDialog时,除非您特别要求,否则永远不会处理该表单。一个简单的是/否示例,询问用户是否确定要关闭。

       If Form2.ShowDialog = Windows.Forms.DialogResult.OK Then
            Select Case MessageBox.Show("Sure to close?", "Warning", MessageBoxButtons.YesNo)
                Case Windows.Forms.DialogResult.Yes
                    Form2.Dispose()
                Case Windows.Forms.DialogResult.No
                    Button2_Click(sender, e)
            End Select
        End If
    

    只要在第二个窗体中选择“确定”,而在下面的消息框中选择“否”,按钮2“单击子对象”将以递归方式调用以保持显示。我希望这有帮助。