Tim Makins
Tim Makins

Reputation: 492

Controlling program-order when using a TabControl

Here is a simple VB.Net Forms program. The form contains a TabControl, which has 2 pages. On TabPage1 there is a Button, and a PictureBox, which contains a small 'Waiting' image. Initially the PictureBox is hidden. The TabControl starts by showing TabPage1.

What I would like to happen is that when the Button is pressed, the PictureBox is made visible, then, my SlowRoutine() is called, then the PictureBox is hidden, then I swap to TabPage2.

What actually happens is that when the Button is pressed, we wait 2 seconds, then we swap to TabPage2. I never see the PictureBox.

If I uncomment the MessageBox line, just to add a halt to the program-flow, then press the Button, the following occurs: 2 seconds passes, and then the PictureBox and the MessageBox appear. Clicking on the MessageBox closes it, and we go to TabPage2. Flipping back to TabPage1 shows that the PictureBox has been hidden.

The order of events is not happening in a logical way. How can I fix this, please?

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        PictureBox1.Visible = False
        PictureBox1.Hide()
        PictureBox1.SendToBack()
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PictureBox1.Visible = True
        PictureBox1.Show()
        PictureBox1.BringToFront()

        SlowRoutine()

        ' MessageBox.Show("I am waiting")

        PictureBox1.Visible = False
        PictureBox1.Hide()
        PictureBox1.SendToBack()
        TabControl1.SelectTab("TabPage2")
    End Sub

    Private Sub SlowRoutine()
        ' My SLOW ROUTINE: wait 2 seconds
        Threading.Thread.Sleep(2000)
    End Sub

End Class

Upvotes: 0

Views: 67

Answers (1)

Tim Makins
Tim Makins

Reputation: 492

Thanks to all. Here is the working code based on those comments, in case anyone else needs to do a similar task:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
        PictureBox1.Visible = False
    End Sub

    Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        PictureBox1.Visible = True
        Await SlowRoutineAsync()
        PictureBox1.Visible = False
        TabControl1.SelectTab("TabPage2")
    End Sub

    Private Async Function SlowRoutineAsync() As Task
        ' My SLOW ROUTINE: wait 2 seconds
        Await Task.Delay(2000)
    End Function

End Class

Upvotes: 3

Related Questions