Мне нужно, чтобы он работал так, чтобы, когда пользователь нажимает кнопку «Отмена», InputBox закрывался без отправки какого-либо ввода.Это возможно?Спасибо за любую помощь:)
Остальные ответы адресуются с помощью встроенной функции InputBox
.Это область, где удобная форма пригодится.Для этого есть два шага:
- Создание самой формы
- Создание процедуры-обработчика для верхней эмуляции собственного вызова InputBox
Создание пользовательской формы, котораявыглядит как поле ввода: заголовок, метка, текстовое поле и две кнопки («ОК» и «Отмена»).Преимущество здесь заключается в том, что вы можете выполнять проверку данных на лету в текстовом поле (например, запретить нечисловые записи), а также можете отключить кнопку «ОК», пока в текстовом поле не будет действительной записи.Это хороший подход к проектированию пользовательского интерфейса - обучает пользователя правильно вводить данные.
Создайте функцию, которая принимает аргументы, аналогичные InputBox.В рамках этой функции вы создаете экземпляр пользовательской формы, сначала заполняете ее любыми необходимыми данными (например, устанавливаете метку для вопроса), отображаете пользовательскую форму, ждете ввода пользователя и затем получаете любые ответы.
Интересующая вас часть: что, если они отменят?
Это проще в VBA с типом Variant, поскольку вы можете вернуть логическое значение или строку (или в интеллектуальномполе ввода приближается к целому числу!).Однако Vb.Net не имеет такой роскоши.
Чтобы достичь этого, добавьте дополнительный параметр в свой пользовательский блок ввода вызова ByRef IsCancelled as Boolean
.Когда пользователь закрывает форму, ваша пользовательская функция (та, которая эмулирует вызов InputBox) может затем установить флаг отмены на основе ваших пользовательских настроек формы.Пример того, как вы могли бы использовать это в своей основной программе:
Dim noUserInput as Boolean
noUserInput = False
strAmountInput = InputBox("Please enter the monthly rainfall for " & strMonth, noUserInput)
If Not no UserInput Then
dblAmount = CDbl(strAmountInput)
'Add monthly rainfall amount to array, using i as index
dblMonthlyRain(i) = dblAmount
'Add item displaying monthly rainfall to listbox
lstMonthlyRainfall.Items.Add("Rainfall for " & strMonth & " = " & CStr(dblMonthlyRain(i)))
End If
Очевидно, что если пользователь отменил, то должна быть причина, поэтому помещение их в бесконечный цикл для продолжения запроса ввода будетраздражает.
То, что я предложил, может показаться дополнительной работой над другими ответами.Однако этот подход можно использовать повторно, и, имея опыт, вы можете адаптировать его к нескольким типам возвращаемых значений, что делает полезную постоянную утилиту для многих программ.
Единственные примеры кода, которые у меня есть, находятся на другой машине,и в VBA (см. мое примечание выше об использовании типа Variant
, который делает это проще).