VB.net 文本框值未更新为 Public 共享变量

VB.net Texbox Value not being updated to Public Shared Variable

我正在设置一个带有文本“Hello”和一个按钮的文本字段 当我更改文本并按下时,我希望有一个消息框回复更改后的文本

Public Class TestText
Dim Text As String = Textbox.text
Private Sub BtnchangeTXT_Click(sender As Object, e As EventArgs) Handles BtnchangeTXT.Click
Text = Textbox.Text
Msgbox(Text)
Msgbox(TextField.Fieldtext)
End Sub
End Class

Public Class TextField
    Public Shared FieldText As String = TestText.Textbox.Text
End Class

一切正常,直到我请求“TextField.FieldText”msgBox,这将始终return默认文本(“你好”)

我哪里出错了? 我尝试设置不同的文本“On Load”,但默认的“Hello”仍在 returned。

这一行:

Public Shared FieldText As String = TestText.Textbox.Text

“FieldText”的值仅在创建该变量时设置一次(甚至在显示带有文本框的表单之前发生)。它不会在 TextBox 更改时更新。

如果您希望该变量始终具有该文本框的当前值,请使用该文本框的 TextChanged() 事件来更新该变量。

Private Sub Textbox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Textbox.TextChanged
        TextField.Fieldtext = Textbox.Text
End Sub

您的代码有两个问题。首先,因为这段代码:

Public Class TextField
    Public Shared FieldText As String = TestText.Textbox.Text
End Class

使用 TestText class 的名称来指代 class 的实例,它指的是默认实例。如果您不知道默认实例是什么,我建议您阅读有关该主题的一些内容。你可以找到我自己的文章 here.

这意味着该代码将始终在该类型的默认实例上获得 TextBoxText。如果您显示默认实例,那很好,但如果您显式创建一个实例并显示它,然后修改该实例上 TextBox 的内容,这对默认实例的影响将完全为零。

第二个问题是您正在使用字段。您似乎认为 FieldText 字段应该随着您更改 TextBox 的内容而动态更改。你为什么那么想?每次获取字段值时,您拥有的代码都不会获取 TextBox 的当前内容。所做的是获取 TextBox 的当前内容,并在您第一次获取该字段时将其分配给该字段,然后再也不会更改该字段值。如果您真正想要的是 TextBox 的当前内容,那么您需要 属性 而不是字段:

Public Class TextField
    Public Shared ReadOnly Property FieldText As String
        Get
            Return TestText.Textbox.Text
        End Get
    End Property
End Class

属性的全部意义在于它们在外部就像字段一样,所以您获取 属性 值的代码不会改变,但它们在内部就像方法一样,所以代码获取TextBox的当前内容将在每次获取属性值时执行。