The Sasquatch
The Sasquatch

Reputation: 793

VB.NET Inputbox - How to identify when the Cancel Button is pressed?

I have a simple windows application that pops up an input box for users to enter in a date to do searches.

How do I identify if the user clicked on the Cancel button, or merely pressed OK without entering any data as both appear to return the same value?

I have found some examples of handling this in VB 6 but none of them really function in the .NET world.

Ideally I would like to know how to handle the empty OK and the Cancel seperately, but I would be totally ok with just a good way to handle the cancel.

Upvotes: 23

Views: 153698

Answers (15)

Page2PagePro
Page2PagePro

Reputation: 168

Though the OP is 14 years old, this SO link is still top of the searches for proper handling InputBox Cancel.

OP was targeting VB.NET. VBA/VB6 share some similarities. VBScript is a slightly different animal.

In short, the "secret sauce" is VarType, which returns "0" for Cancel and "8" for null or actual string.

The following works in Win 10/11 via cscript.exe, wscript.exe and within Office 365 Access/Excel, meaning the code is portable as it is "late bindings" (no IDE lint/intellisense in Office).

Dim strResult
Dim strDefault: strDefault = "Something"

strResult = InputBox("Prompt", "Title", strDefault)
' MsgBox VarType(strResult)

' Handle Cancel
Select Case True
    ' Case StrPtr(strResult) = 0 ' Works in VBA, but not VBScript
    ' Case strResult = vbNullString ' Will catch empty/null also, which is sub-optimal
    Case VarType(strResult) = 0 ' Works in VBScript, but not VBA
        MsgBox "Cancel Pressed."
    Case Len(strResult) = 0
        MsgBox "Empty/Null String Accepted."
    Case Else
        MsgBox "Accepted = " & vbCrLf & strResult
End Select

Upvotes: 1

frigeni
frigeni

Reputation: 11

Base on @Theo69's answer, the following worked for me:

    Dim Answer As String = InputBox("Question", DefaultResponse:=vbCr)
    If Answer = "" Then
        'User pressed cancel
    ElseIf Answer = vbcr Then
        'User pressed ok with an empty string in the box
    Else
        'User gave an answer
        Dim Response As String = Answer.Replace(vbCr, "")
    End If

I used carriage return because I didn't like seeing a character in the textbox.

Upvotes: 1

Jjtx
Jjtx

Reputation: 1

Base on @Theo69's answer, the following worked for me:

Dim answer As String = Nothing
answer = InputBox("Your answer")
If answer is Nothing Then
    'User clicked the Cancel button.
End If

Upvotes: 0

Theo69
Theo69

Reputation: 87

I know this is a very old topic, but the correct answer is still not here.

The accepted answer works with a space, but the user can remove this space - so this answer is not reliable. The answer of Georg works, but is needlessly complex.

To test if the user pressed cancel, just use the following code:

Dim Answer As String = InputBox("Question")
If String.ReferenceEquals(Answer, String.Empty) Then
    'User pressed cancel
Else if Answer = "" Then
    'User pressed ok with an empty string in the box
Else
    'User gave an answer

Upvotes: 7

C.Aymar
C.Aymar

Reputation: 9

You can do it in a simpler way using the DialogResult.cancel method.

Eg:

Dim anInput as String = InputBox("Enter your pin")

If anInput <>"" then

   ' Do something
Elseif DialogResult.Cancel then

  Msgbox("You've canceled")
End if

Upvotes: 0

Sidney
Sidney

Reputation: 1

Guys remember that you can use the try catch end event

Dim Green as integer

Try
    Green = InputBox("Please enter a value for green")
    Catch ex as Exception
        MsgBox("Green must be a valid integer!")
End Try

Upvotes: -1

zmd94
zmd94

Reputation: 110

Although this question is being asked for 5 years ago. I just want to share my answer. Below is how I detect whether someone is clicked cancel and OK button in input box:

Public sName As String

Sub FillName()
    sName = InputBox("Who is your name?")
    ' User is clicked cancel button
    If StrPtr(sName) = False Then
        MsgBox ("Please fill your name!")
        Exit Sub
    End If

   ' User is clicked OK button whether entering any data or without entering any datas
    If sName = "" Then
        ' If sName string is empty 
        MsgBox ("Please fill your name!")
    Else
        ' When sName string is filled
        MsgBox ("Welcome " & sName & " and nice see you!")
    End If
End Sub

Upvotes: -2

Devharsh
Devharsh

Reputation: 1

Dim userReply As String
userReply = Microsoft.VisualBasic.InputBox("Message")
If userReply = "" Then 
  MsgBox("You did not enter anything. Try again")
ElseIf userReply.Length = 0 Then 
  MsgBox("You did not enter anything")
End If

Upvotes: -3

Jgregoire108
Jgregoire108

Reputation: 109

I like using the IsNullOrEmpty method of the class String like so...

input = InputBox("Text:")

If String.IsNullOrEmpty(input) Then
   ' Cancelled, or empty
Else
   ' Normal
End If

Upvotes: 2

Georg
Georg

Reputation: 404

1) create a Global function (best in a module so that you only need to declare once)

Imports System.Runtime.InteropServices                 ' required imports
Public intInputBoxCancel as integer                    ' public variable

Public Function StrPtr(ByVal obj As Object) As Integer
    Dim Handle As GCHandle = GCHandle.Alloc(obj, GCHandleType.Pinned)
    Dim intReturn As Integer = Handle.AddrOfPinnedObject.ToInt32
    Handle.Free()
    Return intReturn
End Function

2) in the form load event put this (to make the variable intInputBoxCancel = cancel event)

intInputBoxCancel = StrPtr(String.Empty)    

3) now, you can use anywhere in your form (or project if StrPtr is declared global in module)

dim ans as string = inputbox("prompt")         ' default data up to you
if StrPtr(ans) = intInputBoxCancel then
   ' cancel was clicked
else
   ' ok was clicked (blank input box will still be shown here)
endif

Upvotes: 3

Michael Parr
Michael Parr

Reputation: 134

Why not check if for nothing?

if not inputbox("bleh") = nothing then
'Code
else
' Error
end if

This is what i typically use, because its a little easier to read.

Upvotes: -3

Ahmet Uğur
Ahmet Uğur

Reputation: 472

Try this. I've tried the solution and it works.

Dim ask = InputBox("")
If ask.Length <> 0 Then
   // your code
Else
   // cancel or X Button 
End If

Upvotes: -2

The Sasquatch
The Sasquatch

Reputation: 793

Here is what I did and it worked perfectly for what I was looking to do:

Dim StatusDate As String
 StatusDate = InputBox("What status date do you want to pull?", "Enter Status Date", " ")

        If StatusDate = " " Then
            MessageBox.Show("You must enter a Status date to continue.")
            Exit Sub
        ElseIf StatusDate = "" Then
            Exit Sub
        End If

This key was to set the default value of the input box to be an actual space, so a user pressing just the OK button would return a value of " " while pressing cancel returns ""

From a usability standpoint, the defaulted value in the input box starts highlighted and is cleared when a user types so the experience is no different than if the box had no value.

Upvotes: 29

Jamie
Jamie

Reputation: 329

Dim input As String

input = InputBox("Enter something:")

If StrPtr(input) = 0 Then
   MsgBox "You pressed cancel!"
Elseif input.Length = 0 Then
   MsgBox "OK pressed but nothing entered."
Else
   MsgBox "OK pressed: value= " & input
End If

Upvotes: -3

Kyle Rosendo
Kyle Rosendo

Reputation: 25277

input = InputBox("Text:")

If input <> "" Then
   ' Normal
Else
   ' Cancelled, or empty
End If

From MSDN:

If the user clicks Cancel, the function returns a zero-length string ("").

Upvotes: 12

Related Questions