Вернуться в первый диалог
-
30-09-2019 - |
Вопрос
У меня есть винформа, которая используется как диалог с просто OK
а также Cancel
Кнопки. Так:
Dim sr As New SlideRangeDialog
Dim dr As Windows.Forms.DialogResult
dr = sr.ShowDialog
У меня есть IF / затем, чтобы посмотреть, нажал ли пользователь 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
Похоже, не работает?
Я снова попытался поднять мероприятие Sub (это щелчок из элемента меню), но это не работает с технологией, которую я использую (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 (или да нет и т. Д.) и отменить в самой форме и не закрывать его, если проверка не удается.
В форме, которая используется в качестве диалога, вам необходимо обрабатывать события щелчка из кнопок. Затем запустите тест в обработчике событий, чтобы решить, следует ли закрыть форму. Если это делает, вы можете установить диалограмму к тому, что вам нужно, и запустить меня .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 вместо этого: Учитывая, как получить HWNDS из темы Windows Используйте этот код:
[DllImport("user32.dll")]
public static extern bool SetFocus(IntPtr hwnd);
Как предложил Preet, это IMHO наиболее простым для обработки оператора «ME.CLOSE» из событий кнопок.
Вы также можете сделать это, удалив его от обработчика событий кнопки и закрыв форму в своем логическом дереве позже. В моем примере у меня есть две формы. FORME1 имеет кнопку для открытия формы2, и у одной есть две кнопки с кнопками OK и отмены. Таким образом, на второй форме вы можете использовать следующее:
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 Sub вызывается рекурсивно для хранения отображения до тех пор, пока OK выбирается во второй форме и NO в следующем сообщении. Надеюсь, это поможет.