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