質問

私はちょうどのダイアログとして使用されるウィンフォームを持っています OKCancel ボタン。それで:

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リボン)では機能しません。

役に立ちましたか?

解決

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

他のヒント

OK(またははいいいえなど)を処理し、フォーム自体でキャンセルし、検証が失敗した場合は閉じないでください。

ダイアログとして使用されるフォームでは、ボタンからクリックイベントを処理する必要があります。次に、イベントハンドラーでテストを実行して、フォームを閉じるかどうかを判断します。もしそうなら、あなたはあなたが必要なものに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

VSTOとあなたは画面間で通信するための「通常」の手段を使用する問題があるので、なぜPinvokeを使用しようとしないのですか。

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

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

これをボタンイベントハンドラーから削除し、後でロジックツリーのフォームを閉じることでこれを行うこともできます。私の例では、2つのフォームがあります。 Form1にはForm2を開くボタンがあり、1つは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を使用する場合、特に電話をかけない限り、フォームは廃棄されないことに留意してください。ユーザーが確実に閉じたいかどうかを尋ねる簡単な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

button2_click subは、次のメッセージボックスで2番目の形式で[OK]が選択されている限り、表示され続けるために再帰的に呼ばれます。これが役立つことを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top