2011-09-29 136 views
1

用户点击一个按钮,用户输入他/她的密码时会生成一个新表单?我如何保留用户名的内存副本?在vb中声明全局变量

例如在Web窗体中,我可以使用Session(“User”)。我怎样才能复制这与WinForms?

由于

+1

供参考:您可能应该尽可能避免这样做,而是在您的应用程序中传递信息。 – JohnFx

+2

强于约翰所说的:你应该**从不**做到这一点,故事结束。你永远不需要。 –

+0

我怎样才能通过我的应用程序的信息?我试过使用公共函数,但我似乎无法通过不同的形式传递变量 – user765942

回答

6

你可以使用一个静态(VB .NET共用)对象

Public Class SessionInformation 

    Public Shared Property UserPassword As String 

End Class 

然后,可以通过调用

SessionInformation.UserPassword 

由于访问此似乎有一些担忧是围绕着这是否是我将要实现的有效实现而进行的解释为什么这不是最好的主意。

这会创建一个SessionInformation的单个实例,这意味着如果它在程序中的任何位置发生更改,则会影响程序的其余部分。

如果您不使用数据库(SQL,Access,文件等)来维护您想要在稍后检索的对象的内存不足副本,维护对象持久性可能会很困难。实现这一点的最简单方法是使用存在于应用程序文件夹中的SQLCE数据库,并使用标准T-SQL来存储所需的信息。但是在密码的情况下,由于安全问题,这可能是不理想的。

或者更好的登录和登出用户的方法是使用System.Security.Principal命名空间为您的应用程序创建一个用户。

+0

谢谢!我将如何去实施这个? – user765942

+2

对不起,低调这一点。没有有效的设计证明这些代码是合理的。使用适当的信息传递机制,而不是全局状态。或者说,如果您确实需要全局状态,那么请实施适当的注册表以获得单一访问点。 –

+0

@KonradRudolph这就是为什么我提到使用System.Security.Principal要我充实,因为它是内置的方式来做用户状态。授予使用全局访问的静态变量是不理想的,但他问如何去做。 – msarchet

0

只需在窗体上使用公共变量,永不卸载窗体,并使用formname.variablename(在窗体级别将其定义为公共)从该窗体获取数据。

如果将它们设置为公共,甚至可以通过控件来实现。

之前的火焰:这解决OP问题,只要这是最佳的,好的或其他任何东西,是另一个问题。

1

您不需要与Web应用程序中的Session对象等效。只需要会话,因为Web应用程序实际上必须跨越流程边界访问变量(= Web应用程序中的会话包含用户对Web服务器的多个请求,并且历史上每个请求都启动了新的应用程序!)。

在“正常”应用程序中,情况并非如此 - 任何非本地变量都可以。在你的特定情况下,密码表单有一个包含用户名的属性是有意义的。然后,用户输入自己的用户名和密码,此密码形式的调用者可以检索用户名:

' The caller looks something like this: 

Dim pw As New PasswordForm() 
pw.ShowDialog() ' Display the dialog, and wait until the user has dismissed it. 
Dim theUsername = pw.Username 

PasswordForm里面,有这样的事情:

Public ReadOnly Property Username() As String 
    Get 
     ' Return the value of the username textbox field. 
     Return UsernameInput.Text 
    End Get 
End Property 

我们可以得到更多的复杂,但这会做。

如果您需要在整个应用程序中重复使用用户名,那么您可能还需要共享有关该用户的其他信息(他们在做什么?)。简言之,这是应用程序的状态,并且通常有一个表示该状态的对象。这将是存储用户名的正确地方。

如果您的应用程序只有一个其他形式(“主对话框”),那么只需在该表单中使用一个私有变量来存储用户名。不需要全局变量。