#vb.net #winforms
#vb.net #winforms
Вопрос:
У меня есть форма, в которой размещена сетка данных, из которой пользователь может выбрать, какие элементы они хотят загрузить. Форма предлагает пользователю проверить, хотят ли они закрыть форму (когда они нажимают «X»), и если они это сделают, все текущие загрузки будут прерваны. Я обрабатываю это поведение с помощью приведенного ниже метода :
Private Sub OnFormClose(sender As Object, e As FormClosingEventArgs) Handles MyBase.Closing
If not MessageBox.Show("Are you sure to close this application?", "Close", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
e.Cancel = True
Else
<Code to stop the downloads>
End If
End Sub
Я пытаюсь автоматически закрыть эту форму, когда файл, который пользователь хочет загрузить, загружен полностью. В настоящее время поведение заключается в том, чтобы пользователь закрывал форму вручную. Я пытаюсь сделать что-то вроде приведенного ниже :
Private Function downloadSelectedFile(string Address)
Try
fileReader = New WebClient()
fileReader.DownloadFile(New Uri(Address), DestPath)
Me.Close()
Catch ex As Exception
<Exception Handling>
End Try
End Function
Теперь, когда код попадает в Me.Close()
строку, он запрашивает пользователя, хочет ли он закрыть форму. Это не работает, потому что пользователь на самом деле не решил закрыть форму. Есть ли способ, которым я могу передать параметр Me.Close()
функции, чтобы сообщить ей, что это системное закрытие формы?
Комментарии:
1. Является
downloadSelectedFile
ли метод в той же форме, в которой пользователь выбирает файлы для загрузки? Почему вы решили закрыть форму после загрузки одного файла? (не то, чтобы он делал это в настоящее время; вы используете DownloadAsync, но не ожидаете его, поэтому форма немедленно закроется; я бы не гарантировал, что в таком случае рабочий завершит загрузку)2. Просто добавьте закрытое поле типа Boolean, установите для него значение True, прежде чем вызывать Меня.Close() Теперь знаю, что делать в OnFormClose() .
3. @CaiusJard извините, я плохо написал репрезентативный код 🙂 есть событие, которое срабатывает при завершении загрузки, и метод, который обрабатывает этот метод, фактически закроет форму. И да, этот метод находится в форме he. Причина, по которой я хотел бы закрыть форму, заключается в том, что после загрузки файла пользователь может дополнительно обработать его с помощью моего приложения, и окно просто остается там
4. @HansPassant коротко и просто. Спасибо!!
Ответ №1:
Все это не имеет смысла
- вы спрашиваете пользователя, уверены ли они, что хотят выйти, и когда они говорят «да», вы отменяете выход.
- Вы никогда не используете отмену загрузки асинхронной с помощью токена отмены и
- вы закрываете форму сразу после начала загрузки.
Возможно, у вас должна быть дочерняя форма, предназначенная для загрузки одного файла и отчетности о его ходе. Если ваш пользователь отмечает несколько файлов, откройте кратные этой форме. Закрытие этой формы выполнения загрузки приведет к отмене загрузки, но не к завершению работы приложения (поскольку это дочерняя форма). Форма может спросить, уверен ли пользователь, что он отменит загрузку, когда она закроется, и если они скажут «нет, не уверен», тогда не закрывайте форму. Кроме того, FormClosingEventArgs, который передается событию FormClosing (которое испытывает форма загрузки profrsss), имеет CloseReason, который является одним из значений CloseReason enum . Вы можете использовать это, чтобы определить, закрывается ли владелец формы, поэтому, если вы настроили основную форму в качестве владельца формы выполнения, тогда основная форма может спросить: «Вы уверены, что нужно выйти?», А принадлежащие формы индикатора выполнения могут знать, что они закрываются, потому что владелец закрывается иНЕ каждый спрашивает: «Вы уверены, что нужно отменить загрузку?» (Это будет раздражать, если выполняется десять загрузок), поэтому они могут просто отменить загрузку и закрыть
Возможно, обычно имеется флажок «закрыть приложение после завершения всех загрузок» — основная форма может прикрепляться к событию FormClosed формы выполнения при ее создании / открытии. Если основная форма запрашивает приложение.Коллекция OpenForms каждый раз, когда дочерний элемент закрывается и обнаруживает, что обработка OpenForms содержит только одну форму (основную форму), а флажок «закрыть по завершении» отмечен, тогда он может знать, чтобы закрыть себя с помощью Application.Выход и его собственная причина закрытия будут отличаться от того, если бы пользователь нажал кнопку закрытия, чтобы он мог знать, что не нужно спрашивать «вы уверены, что нужно выйти?»