最初のダイアログに戻ります
-
30-09-2019 - |
質問
私はちょうどのダイアログとして使用されるウィンフォームを持っています 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リボン)では機能しません。
解決
検証ロジックをダイアログ自体、またはダイアログのクロージングイベントハンドラーに移動してみてください。後者は簡単かもしれません。私の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]が選択されている限り、表示され続けるために再帰的に呼ばれます。これが役立つことを願っています。