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

时间:2011-10-31 00:06:14

标签: vb.net winforms label

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

3 个答案:

答案 0 :(得分:0)

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

修改

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

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

这样的自定义控件不难创建。您可以根据需要设置样式,甚至可以在以后需要时添加更多功能(如注销链接)。在此用户控件的Load-event中,您可以检索登录的用户名(通过静态属性或其他机制)并将其显示在内部。

使用此功能,您唯一需要做的就是将此用户控件放在应显示用户名的所有表单中,其余表单自动运行。有关如何创建用户控件的帮助,谷歌中有很多教程,它基本上就像创建表单一样。

答案 1 :(得分:0)

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

这样,用户信息可以在用户知道的一个位置获得,您不会占用带有标签的宝贵屏幕空间,而且您不必担心新表格。

如果设计确实需要每个表单中的标签,那么最好的办法是创建一个每个表单都继承自的基类。在表单Load事件期间,您可以使用Form的Controls集合中的Find方法来查找包含用户名并设置它的标签(这假定标签都具有相同的名称)。

例如:

Dim oLabel As Label

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

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

答案 2 :(得分:0)

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

B中。有很多方法可以解决您的问题。虽然循环通过所有63种形式是其中之一,但它不是最有效,最有效,或再次可维护的。

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

competent_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模块中创建类。使用Project / Add / New Class 然后创建一个继承自System.Windows.Forms.Label的NEW类(不在My.ApplicationEvents模块中!),如下所示:

Public Class MyUserLabel
    Inherits System.Windows.Forms.Label

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

在MyUserLabel控件在工具箱中可见之前,您需要构建项目。构建之后,控件将可供您拖动到表单中。或者您可以使用范围设置为“整个项目”的Find / REplace。将“label2”替换为“MyUserControl”

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

然后用MyUserLabel替换所有表单上的Label2(你可以用Find查找并将scoped替换为整个项目)。

希望有所帮助。

以下是代码:

       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

结束命名空间