2011-09-29 298 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 

我們可以得到更多的複雜,但這會做。

如果您需要在整個應用程序中重複使用用戶名,那麼您可能還需要共享有關該用戶的其他信息(他們在做什麼?)。簡言之,這是應用程序的狀態,並且通常有一個表示該狀態的對象。這將是存儲用戶名的正確地方。

如果您的應用程序只有一個其他形式(「主對話框」),那麼只需在該表單中使用一個私有變量來存儲用戶名。不需要全局變量。