Вопрос

У меня есть винформа, которая используется как диалог с просто 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 в следующем сообщении. Надеюсь, это поможет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top