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