skip to Main Content

Label is not visible in the following code . I need to show a message please wait when the user clicks login.It shows before but after adding the time interval its not showing

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Label3.Visible = True
    If TextBox1.Text = "Akilan" And TextBox2.Text = "123" Then

        System.Threading.Thread.Sleep(5000)

        Form2.Show()
        Hide()

    Else
        MsgBox("Sorry, The Username or Password was incorrect.", MsgBoxStyle.Critical, "Information")
    End If

End Sub

3

Answers


  1. Thread.Sleep on the UI thread will cause your form to "freeze". It sounds like you want some sort of waiting indicator while the background code is running.

    What you should do is execute your long running code asynchronously, show your label, wait for the asynchronous code to finish, then do something (e.g. hide the label).

    Using your code, it’d look something like this:

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label3.Show()
    
        If (TextBox1.Text = "Akilan" AndAlso TextBox2.Text = "123") Then
            Dim t = Task.Run(Sub() Threading.Thread.Sleep(5000))
            t.Wait()
            Label3.Hide()
        Else
            MessageBox.Show("Sorry, the username or password was incorrect", "Invalid Credentials", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub
    
    Login or Signup to reply.
  2. The way to do this is to hide/show the label text client side. Then when the page travels up to server and your code behind runs, the client side will still show that message. When you code behind is done, then the whole page now travels back down to the client side is re-load + re-display.

    Grasping the above so called "round trip" is REALLY important here.

    Since your code behind never interacts with the user, but only that copy of the web page that JUST traveled up to the server, and the code behind can play with, change and modif that page – but client side can ONLY see such updates AFTER the page travels all the way back down to client side. That’s why this code can’t work:

    Label3.Visible = True
    If TextBox1.Text = "Akilan" And TextBox2.Text = "123" Then
    
        System.Threading.Thread.Sleep(5000)
    
        Form2.Show()
        Hide()
    

    The above code will set Label.visible = true, but the whole page has not yet done its code, and the whole page is still on the server side. ONLY AFTER all your code is done, does the page travel back to client side, and show the label – but ALL code has to complete before page travels back down to client side.

    However, this code will work just fine:

    enter image description here

    So lets look at above:

    First up, we do NOT use visible=false for the label. The reason is that if you do that, then the label is NOT rendering in the markup.

    Next up, we added a onclient click event to the button.

    And we have our button code that has this code:

     Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        Thread.Sleep(3000)
    
    End Sub
    

    So, when you run this, you see this for 3 seconds:

    enter image description here

    So what happens?

    Well, you click on button – the OnClient code (javascrt client side) will run and THEN the post back of the page up to the server occurs.

    So, since that label is now "show", then it will display. Now the web page is up on the server – your code behind runs. When code behind is done?

    The WHOLE page now makes the trip back to browser client side. And this ALSO means our label message will automatic hide again – since the page is re-plotted with the whole new page that the server just send back to the client side.

    Do note, that in above, I assumed jQuery is installed. If not then your script will have to be this:

              function ShowLabel()
                {
                    lbl = document.getElementById("lblMessage")
                    lbl.style.display = "inline"
                }
    

    Note also close how I set the id mode of lable = static – I often do that, since then referencing controls in js becomes a lot easier.

    So, the real trick here?

    We display the label client side, and then whatever and how ever long the server takes is the amount of time the label will display. And when that whole new fresh web page comes back down from the server, then the label will re-vert back to being hidden (display:none).

    So, do keep in mind this VERY important concept of round trip. When you code runs behind and changes values or controls on the page? The end user does NOT see such changes until ALL code behind is done, AND THEN the page travels back down to the user. In fact, then your code behind to hide or show, can become before or after the delay in code – it will NOT update client side and in fact the order that that change label and delay will NOT matter (since the web page is STILL up on the server). So all your changes you make to the page remain up on the server until all code is done, and THEN the whole page comes back to client side to show such changes.

    The other way would be to consider ajax calls – but baby steps here first, right?

    Login or Signup to reply.
  3. You can make Button Click event asynchronous.
    The following code works for me:

    Private Async Sub  Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Label3.Visible = True
        If TextBox1.Text = "Akilan" And TextBox2.Text = "123" Then
            Label3.Text = "Please wait"
            Await Task.Delay(500)
            Label3.Text = ""
            Form2.Show()
            Hide()
        Else
            MsgBox("Sorry, The Username or Password was incorrect.", MsgBoxStyle.Critical, "Information")
        End If
    End Sub
    

    Also check:

    1. Async (Visual Basic)
    2. When to use Task.Delay, when to use Thread.Sleep?
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search