Вернуться в первый диалог - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть 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 не работает?

Я попытался снова вызвать подпрограмму события (это щелчок по пункту меню), но это не работает с технологией, которую я использую(Лента ВСТО).

Ответы [ 4 ]

1 голос
/ 10 ноября 2010

Попробуйте переместить логику проверки либо в само диалоговое окно, либо в обработчик события закрытия для этого диалогового окна. Последнее может быть проще. Мои навыки в 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
1 голос
/ 10 ноября 2010

Я думаю, что вам нужно обработать нормально (или Да, НЕТ и т. Д.) И отменить в самой форме, а не закрывать ее, если проверка не пройдена.в качестве диалогового окна вам нужно обрабатывать события нажатия от кнопок.Затем запустите тест в обработчике событий, чтобы решить, должна ли форма быть закрыта.Если это так, вы можете установить 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
0 голосов
/ 10 ноября 2010

Как предложил Преет, имхо проще всего обрабатывать оператор Me.Close из событий кнопки.

Вы также можете сделать это, удалив его из обработчика событий кнопки и позже закрыв форму в дереве логики. В моем примере у меня есть две формы. В Form1 есть кнопка для открытия Form2, а в другой - две кнопки с кнопками 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 вызывается рекурсивно для отображения, пока выбрано ОК во второй форме и НЕТ в следующем окне сообщений. Надеюсь, это поможет.

0 голосов
/ 10 ноября 2010

Поскольку VSTO и у вас возникают проблемы с использованием «обычных» средств связи между экранами, почему бы вам не попробовать использовать pInvoke вместо этого: учитывая, что вы знаете, как получить hwnds предметных окон, используйте этот код:1002 *

...