0

我有一个 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

4 回答 4

1

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

在用作对话框的表单上,您需要处理来自按钮的单击事件。然后在事件处理程序中运行测试以确定是否应该关闭表单。如果是这样,那么您可以将 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
于 2010-11-09T22:45:34.170 回答
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
于 2010-11-09T22:49:25.403 回答
0

由于它的 VSTO 并且您在使用“正常”方式在屏幕之间进行通信时遇到问题,为什么不尝试使用 pInvoke 代替:假设您知道如何获取主题窗口的 hwnd,请使用以下代码:

    [DllImport("user32.dll")]
    public static extern bool SetFocus(IntPtr hwnd); 
于 2010-11-09T22:49:57.257 回答
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 时,除非您特别要求,否则表单永远不会被丢弃。一个简单的 Yes/No 示例,询问用户是否确定要关闭。

   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

只要在第二种形式中选择 OK 并且在下面的 Messagebox 中选择 NO,就递归调用 Button2_Click 子程序以保持显示。我希望这有帮助。

于 2010-11-09T23:55:50.107 回答