返回第一个对话框

时间:2010-11-09 22:41:28

标签: c# .net vb.net winforms dialogresult

我有一个WinForm,用作只有OKCancel按钮的对话框。所以:

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

我有一个If / Then来查看用户是否按了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 个答案:

答案 0 :(得分:1)

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

在用作对话框的表单上,您需要从按钮处理Click事件。然后在事件处理程序中运行测试以确定是否应关闭表单。如果是,那么您可以将DialogResult设置为您需要的任何内容并运行Me.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

答案 1 :(得分:1)

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

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

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

答案 3 :(得分:0)

正如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

只要在第二种形式中选择“确定”并在以下“消息框”中选择“否”,就会递归调用Button2_Click子以继续显示。我希望这会有所帮助。