2017-02-23 55 views
0

我有一个全局变量g_user作为字符串和标签lb_welcome显示的用户名,如何创建一个全球性的事件时g_user再改将触发功能如何创建全局事件?

Private Sub Login() 
    g_user = VerifyUser(id,password) 
    lb_welcome.Text = $"Welcome {g_user}" 
End Sub 

我尝试做这样的事情: -

Private Sub RefreshLabel() 
     lb_welcome.Text = $"Welcome {g_user}" 
    End Sub 

    Private Sub g_user_Changed(sender As Object, e As EventArgs) Handles g_user.Changed 
     RefreshLabel() 
    End Sub 

上面只是一个例子,lb_welcome.Text包含许多全局变量,我总是需要手动添加当一个变量发生变化的功能,所以是有可能创造一个全球性的事件来帮我自动运行功能?

+0

在VB .NET中不存在*全局变量*。你确定你的标签是正确的吗?你使用VB 6吗? –

+0

@AlexB。公共g_user作为字符串我有这个模块内,这个变量可以使用所有形式,所以我认为这是全局变量?我使用VB.NET而不是VB6。 – vbnewbie

+0

嗯模块中的公共变量是全球性的......我忘了微软在这里提供的那些肮脏的黑客... –

回答

1

你需要定义你的模块,它是,如果你的属性之一(这里g_user)提出了一个公共事件改变:

Public Module MyModule  
    Public Event Changed As EventHandler(Of ChangedEventArgs) 

    Private _user As String 
    Public Property g_user As String 
     Get 
      Return _user 
     End Get 
     Set(value As String) 
      _user = value 
      raisePropertyChanged("g_user", value) 
     End Set 
    End Property 

    Private Sub raisePropertyChanged(propertyName As String, value As String) 
     RaiseEvent Changed(Nothing, New ChangedEventArgs() With {.PropertyName = propertyName, .Value = value}) 
    End Sub 
End Module 

EventArgs的是非常直截了当:

Public Class ChangedEventArgs 
    Inherits EventArgs 

    Public PropertyName As String 
    Public Value As String 
End Class 

在你的表单中钩住事件并对其作出反应:

Public Class Form1 

    Public Sub New() 

     ' This call is required by the designer. 
     InitializeComponent() 

     ' Add any initialization after the InitializeComponent() call. 
     AddHandler MyModule.Changed, AddressOf RefreshLabel 

    End Sub 

    Private Sub RefreshLabel(s As Object, e As ChangedEventArgs) 
     If e.PropertyName = "g_user" Then 
      lb_welcome.Text = $"Welcome {e.Value}" 
     Else 
      '... 
     End If 
    End Sub 
End Class 
+0

感谢它的工作! – vbnewbie

+0

很高兴听到:) –