C# 返回到第一个对话框

C# 返回到第一个对话框,c#,.net,vb.net,winforms,dialogresult,C#,.net,Vb.net,Winforms,Dialogresult,我有一个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 Window

我有一个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功能区)不兼容。

我认为您需要在表单本身中处理确定(或是否等)和取消,如果验证失败,则不关闭它

在用作对话框的窗体上,您需要处理来自按钮的单击事件。然后在事件处理程序中运行测试,以确定是否应关闭表单。如果是,那么您可以将DialogResult设置为所需的任何值,并运行Me.Close()

请参阅以获取示例

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

尝试将验证逻辑移动到对话框本身或对话框的关闭事件处理程序中。后者可能更容易。我的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

既然是VSTO,您在使用“正常”方式在屏幕之间进行通信时遇到问题,为什么不尝试使用pInvoke: 如果您知道如何获取主题窗口的HWND,请使用以下代码:

    [DllImport("user32.dll")]
    public static extern bool SetFocus(IntPtr hwnd); 

正如Preet所建议的,处理button事件中的“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\u Click sub以保持显示。我希望这能有所帮助。

这很好,让我来处理一下,看看是否能让它工作。@Otaku我的VB语法正确吗?我不得不用谷歌搜索它!是的,语法很准确。