Form Controls not updated from Class methods

后端 未结 1 467
离开以前
离开以前 2020-12-04 04:00

I am a newcomer to Visual Studio 2013, so my question is probably -and hopefully- a simple one.

I am currently writing a small program (in VB) that will essentially

1条回答
  •  独厮守ぢ
    2020-12-04 04:28

    Forms are classes (it says so at the top of each of them):

    Public Class MainForm
      ....
    

    As a class, an instance should be created however, VB allows what is called a default instance using the class name: MainForm.Show()

    Under the hood, the compiler creates an instance of MainForm named MainForm and uses it. This is handy for developers hobbyists dabbling in code, but there are numerous ways this can bite you:

    Sub DoSomeThing()
        Dim frm As New Form1
        frm.TextBox1.Text = cp.ToString
    End Sub
    

    Here a local instance of Form1 is created and used which has no relation to the Global Form1 which VB created. The local object goes out of scope at the end of the Sub never to be used by the rest of the app.

    ' in sub main:
    Application.Run(New Form1)     ' main form/pump
    
    ... elsewhere
    Form1.TextBox1.Text = "hello, world!"
    

    In spite of using the same name, these are actually different instances. The text will not show up and if the next line was Form1.Show(), a second copy of Form1 would display complete with the 'hello, world' text. These will also create/show new instances:

    Form2.Show()
    
    ' or
    Dim frm As New Form2
    frm.Show()
    

    In general, the more complex the app, the less appropriate using default instances is. For serious apps, create explicit form instances:

    Dim myFrm = New Form7()     ' myFrm is an instance of Form7
     ...
    myFrm.TextBox1.Text = vName
    myFrm.TextBox2.Text = vLastName
    myFrm.Show
    

    Classes or other forms can be told about this form various ways such as via a property or the constructor:

    Class Foo
        Private myFrm As Form7
    
        Public Sub New(frm As Form7)
            myFrm = frm
        End Sub
        ...
    End Class
    
    Dim myFoo = New Foo(Me)
    

    For the main/startup form, it can help to create a global reference:

    Module Program
        Friend frmMain As MainForm
    End Module
    

    Then set the variable when the main form loads:

    Public Class MainForm
       Private Sub MainForm_Load(sender ...)
    
           frmMain = Me
       End Sub
       ...
    

    frmMain will be a valid reference to the main form for the entire application.

    0 讨论(0)
提交回复
热议问题