user2234234
user2234234

Reputation: 349

how to run a function/sub after loading the form window in VB?

I have a function that gets User ID from USB badge reader, used to log in an application. when I run the app, the log in window does not appear until I swipe the tag. I need to know if it`s possible to load the windows, then to start running the function that gets the data from the USB.

Thanks :)

Private Sub SerialPort1_DataReceived()
    'Threading.Thread.SpinWait(1000)
    OpenPort()
    If SerialPort1.IsOpen() Then

        byteEnd = SerialPort1.NewLine.ToCharArray
        'read entire string until .Newline 
        readBuffer = SerialPort1.ReadLine()
        readBuffer = readBuffer.Remove(0, 1)
        readBuffer = readBuffer.Remove(8, 1)
        WWIDTextBox.AppendText(readBuffer)

    End If
End Sub

Private Sub Form1_Activated(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles MyBase.Activated
    SerialPort1_DataReceived()
End Sub

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    'SerialPort1_DataReceived()
End Sub

Upvotes: 3

Views: 29940

Answers (4)

Ivan Perez
Ivan Perez

Reputation: 142

Working on VS2013, I came across the same issue, I needed to to a datagridview refresh (colors in the gridrows). This worked for me.

Sub MyForm_VisibleChanged(sender As Object, e As EventArgs) Handles Me.VisibleChanged

            If Me.Visible Then
                'do action...
            End If

End Sub

Upvotes: 1

user4368893
user4368893

Reputation: 1

Private Sub loadCombo()
    Dim sqlconn As New OleDb.OleDbConnection
    Dim connString As String
    connString = ""
    Dim access As String
    access = "select slno from atable"
    Dim DataTab As New DataTable
    Dim DataAdap As New OleDbDataAdapter(access, connString)
    DataAdap.Fill(DataTab)
    ComboBox1.DataSource = DataTab
    ComboBox1.DisplayMember = "slno"

End Sub

Upvotes: 0

Steven Doggart
Steven Doggart

Reputation: 43743

The problem is that you are calling the ReadLine method, which is a blocking (synchronous) method. In other words, when you call it, the method does not return the value until it has the value to return. Because of that, it stops execution on the current thread until a complete line is read (when the badge is swiped). Since you are on the UI thread when you call it, it will lock up the UI until the badge is swiped.

Instead of calling your SerialPort1_DataReceived method from the UI thread, you can do the work from a different thread. The easiest way to do that is to drag a BackgroundWorker component onto your form in the designer. Then you can add code like this:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    BackgroundWorker1.RunWorkerAsync()
End Sub

Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    OpenPort()
    If SerialPort1.IsOpen() Then
        byteEnd = SerialPort1.NewLine.ToCharArray
        Dim readBuffer As String = SerialPort1.ReadLine()
        readBuffer = readBuffer.Remove(0, 1)
        readBuffer = readBuffer.Remove(8, 1)
        e.Result = readBuffer
    End If
End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    WWIDTextBox.AppendText(CStr(e.Result))
End Sub

Upvotes: 6

Pandian
Pandian

Reputation: 9126

Try Form Activated Event

Private Sub Form1_Activated(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MyBase.Activated
 'Call your function here
End Sub 

It call the function After the Form Loads...

Upvotes: 0

Related Questions