如何在vb.net中通过循环访问不同的表单并更改标签文本

如何在vb.net中通过循环访问不同的表单并更改标签文本,vb.net,winforms,label,Vb.net,Winforms,Label,我制作了一个vb.net应用程序,它有63个表单。在每个表单label2上都应该包含使用应用程序的用户名。向用户显示的第一个表单是登录表单。当用户单击此表单上的登录按钮时,所有新打开的窗口中的用户名应显示在label2中。我该怎么做呢?首先,我强烈建议您将控件和标签的名称更改为将来更易于维护的名称,如userLabel 编辑: 当您的登录表单显示时,您没有打开其他窗口,因此对于您的应用程序来说,它们不存在(尚未),因此您无法循环使用它们或更改状态 由于您有大量的表单,您应该尝试找到一个不需要大量

我制作了一个vb.net应用程序,它有63个表单。在每个表单
label2
上都应该包含使用应用程序的用户名。向用户显示的第一个表单是登录表单。当用户单击此表单上的登录按钮时,所有新打开的窗口中的用户名应显示在
label2
中。我该怎么做呢?

首先,我强烈建议您将控件和标签的名称更改为将来更易于维护的名称,如userLabel

编辑:

当您的登录表单显示时,您没有打开其他窗口,因此对于您的应用程序来说,它们不存在(尚未),因此您无法循环使用它们或更改状态

由于您有大量的表单,您应该尝试找到一个不需要大量重复代码的解决方案。其他人建议使用MDI窗口,这可能是一种解决方案。另一个解决方案是您创建的自定义登录用户控件

创建这样的自定义控件并不困难。你可以随心所欲地设计它,甚至在需要时添加更多功能(比如注销链接)。在该用户控件的加载事件中,您可以检索登录的用户名(通过静态属性或其他机制)并在其中显示它


有了它,您唯一需要做的就是将这个用户控件放在所有表单中,这些表单都应该显示用户名,其余的自动工作。有关如何创建用户控件的帮助,在谷歌中有很多教程,基本上类似于创建表单。

除非设计在每个窗体中需要一个标签,否则您可能想考虑使用一个MDI容器的窗体作为主要表单,在表单底部添加一个状态栏,以及将用户名存储在状态栏字段之一中

通过这种方式,用户信息可以在用户知道的一个位置获得,您不需要使用带有标签的有价值的屏幕内容,也不必担心新表单

如果设计在每个表单中都需要一个标签,那么最好的办法是创建一个基类,每个表单都从该基类继承。在表单加载事件期间,您可以使用表单控件集合中的Find方法查找保存用户名的标签并进行设置(这假定所有标签都具有相同的名称)

例如:

Dim oLabel As Label

oLabel = TryCast(Me.Controls.Find("label2", True), Label)

If oLabel IsNot Nothing Then
  oLabel.Text = globalusername
End If

答:我非常同意aKzenT以一致且易于识别的方式命名控件。我们的现代快速机器的一个好处是,我们可以在变量和类的代码中使用描述性名称。:-)

有很多方法可以解决你的问题。虽然在所有63个表单之间循环是其中之一,但它并不是最高效、最有效的,或者说是最容易维护的

C.不确定您是如何处理登录的,因此我不确定用户在您的登录表单上单击“确定”后会发生什么。您是否设置了自己的登录处理,还是使用内置身份验证

Competable_tech走上了正确的道路,建议继承。更进一步,您可以使用My.Application特性来包含全局变量。转到项目属性窗口/应用程序/查看应用程序事件。您将看到以下代码文件。添加所示代码:

Namespace My

    Partial Friend Class MyApplication


        'Add THIS code block:
        Private _CurrentUserName As String = "Current User"
        Public Property CurrentUserName() As String
            Get
                Return _CurrentUserName
            End Get
            Set(ByVal value As String)
                _CurrentUserName = value
            End Set
        End Property

    End Class

End Namespace
现在,您的登录表单可以如下设置应用程序变量:

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click
    My.Application.CurrentUserName = Me.UsernameTextBox.Text
    'YOUR LOGIN CODE HERE . . .
    Me.Close()
End Sub
不要在My.Application模块中创建类。使用项目/添加/新建类 然后创建一个新类(不在My.ApplicationEvents模块内!),该类继承自System.Windows.Forms.Label,如下所示:

Public Class MyUserLabel
    Inherits System.Windows.Forms.Label

    Public Sub New()
        Me.Text = My.Application.CurrentUserName
    End Sub
End Class
您需要在MyUserLabel控件在工具箱中可见之前构建项目。生成后,该控件将可供您拖动到窗体。或者,您可以使用范围设置为“整个项目”的查找/替换。将“label2”替换为“MyUserControl”

上述代码将导致MyUserLabel实例在初始化时(即使在设计模式下)将每个实例的.Text属性设置为My.Application.CurrentUser变量表示的值

然后用MyUserLabel替换所有表单上的Label2(您可能可以通过查找并替换整个项目的范围来完成)

希望有帮助

代码如下:

       Namespace My

' The following events are availble for MyApplication:
' 
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed.  This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active. 
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication

    'Add THIS code block:
    Private _CurrentUserName As String = "Current User"
    Public Property CurrentUserName() As String
        Get
            Return _CurrentUserName
        End Get
        Set(ByVal value As String)
            _CurrentUserName = value
        End Set
    End Property
    Public Class MyUserLabel
        Inherits System.Windows.Forms.Label

        Public Sub New()
            Me.Text = My.Application.CurrentUserName
        End Sub
    End Class


End Class

End Namespace

登录表单是第一个表单,一次只显示一个表单…我想要的功能只是显示用户名,如label.text,该用户名已在应用程序中签名…我想要在所有表单上设置标签文本当用户登录inOkay时,我添加了一些信息,可以帮助您做出响应。我还对你的问题进行了一些编辑,添加了你刚才告诉我的信息,使其他人更容易理解你的需要。一旦您对一个答案感到满意,请将其标记为已接受答案。这可以帮助其他人解决类似的问题,并奖励帮助过你的人。我尝试过上面的代码,在构建项目后,我在工具箱中看不到新控件……我在一个名为mod1的模块中创建了public类……我还想提一下,我正在使用一个定制的登录表单(由我设计)带有两个文本框和登录按钮在错误列表中单击。项目建设成功了吗?没有理由不在工具箱中显示MyUSerLable。通常在“Components”或“YourProjectNamespace Components”以及选择箭头中。此外,没有理由不能对全局变量使用公共模块,尽管我再次强烈建议重命名,以便代码更易于使用/维护。然而,My.Application命名空间是一个更符合逻辑的地方,可以将其放在。即使将其放置在My.Application命名空间中,它在toolboxI中也不可见。过去,我在visual studio中经常遇到类似的问题。尤其是早期版本。我建议您卸载ve