0

OKとボタンだけのダイアログとして使用される WinForm がありCancelます。そう:

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

ユーザーが [OK] を押したかどうかを確認する 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

4 に答える 4

1

検証ロジックをダイアログ自体、またはダイアログの終了イベントハンドラーに移動してみてください。後者の方が簡単かもしれません。私の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 に答える
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 に答える
0

そのVSTOと、画面間の通信に「通常の」手段を使用する際の問題があるため、代わりにpInvokeを使用しないでください。サブジェクトウィンドウのhwndを取得する方法を知っている場合は、次のコードを使用してください。

    [DllImport("user32.dll")]
    public static extern bool SetFocus(IntPtr hwnd); 
于 2010-11-09T22:49:57.257 に答える
0

Preetが示唆したように、ボタンイベントから「Me.Close」ステートメントを処理するのが最も簡単です。

これは、ボタン イベント ハンドラーから削除し、後でロジック ツリーでフォームを閉じることによっても実行できます。私の例では、2 つのフォームがあります。Form1 には Form2 を開くためのボタンがあり、そのボタンには [OK] ボタンと [キャンセル] ボタンのある 2 つのボタンがあります。したがって、2 番目のフォームでは、次のように使用できます。

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 サブルーチンは再帰的に呼び出され、2 番目のフォームで OK が選択され、次のメッセージ ボックスで NO が選択されている限り、表示を続けます。これが役立つことを願っています。

于 2010-11-09T23:55:50.107 に答える