Home > Back-end >  VB fires changetext event before control is loaded
VB fires changetext event before control is loaded

Time:07-12

I need to add some controls to a Visual Basic 2017 form programmatically. One of the controls is a textbox that needs a changetext event handler. Below is some code that accomplishes that task.

HOWEVER, the changetext event handler seems to fire right away, before the form even loads... before the textbox itself even loads! A "click" handler works fine, as expected. But changetext? Nope.

I've thrown together a simplified version to demonstrate. The line with the "DIES RIGHT HERE" comment causes the problem (not the comment, but the code to the left of it).

A textbox that is added at design time will work fine, not cause this problem, but that isn't an option.

What's causing this the changetext handler to be run early? How do I work around this?

Public Class Form1
    Dim txtTest As TextBox
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim pntTextBox As Point
        pntTextBox.X = 100
        pntTextBox.Y = 100
        txtTest = New TextBox
        With txtTest
            .Location = pntTextBox
            .Width = 100
            AddHandler txtTest.TextChanged, AddressOf txtTest_TextChanged
        End With
        Me.Controls.Add(txtTest)
    End Sub

    Private Sub txtTest_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyClass.TextChanged
        Dim strTest As String
        strTest = Str(txtTest.Width)  ' ****** DIES RIGHT HERE
        MsgBox(strTest)
    End Sub
End Class

CodePudding user response:

Made a few changes. Works.

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        For x As Integer = 1 To 2 'create multiple TB's
            Dim pntTextBox As Point
            pntTextBox.X = 100 * x
            pntTextBox.Y = 100
            Dim txtTest As TextBox = New TextBox
            With txtTest
                txtTest.Name = "tb_" & x.ToString
                AddHandler txtTest.TextChanged, AddressOf txtTest_TextChanged
                .Location = pntTextBox
                .Width = 100
            End With
            Me.Controls.Add(txtTest)
        Next
    End Sub

    Private Sub txtTest_TextChanged(ByVal sender As Object,
                                    ByVal e As System.EventArgs) 'no handler at design time
        Dim tb As TextBox = DirectCast(sender, TextBox)
        Dim strTest As String
        strTest = tb.TextLength.ToString
        Debug.WriteLine("{0} {1}", tb.Name, strTest) 'put breakpoint here
    End Sub
End Class
  • Related