2013-05-05 3 views
-2

Prenez cet exemple:Est-ce que les variables sont sauvegardées lorsque le formulaire se ferme?

J'ai un LoginForm et quand j'entre mes lettres de créance dans la zone de texte et cliquez sur Go il le me dirige vers ma principale HomeForm. En ce cas, il stocke le texte de l'utilisateur actuel de l'utilisateur Textbox sous la forme de connexion dans un Public Variable dans le HomeForm appelé CurrentUser donc mon code est comme ceci:

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 
Home.CurrentUser = UsernameTextBox.text 
End Sub 

Lorsque je tente ensuite d'accéder aux informations stockées dans la variable je n'ai aucun problème c'est juste que je veux savoir si l'utilisateur ferme la HomeForm la variable sera toujours égale à la valeur précédente avant que l'utilisateur ait fermé le formulaire. Et si non, comment recommanderiez-vous sur l'épargne. Je ne veux pas utiliser des lecteurs/auteurs de flux en raison de tous les fichiers texte inutiles.

Toute aide est grandement appréciée!

Répondre

3

Si vous déclarez CurrentUser comme Partagé il garderez la valeur même quand la forme est fermée puis réouverte (en supposant que l'ensemble de l'application n'a pas été fermée):

Public Class HomeForm 

    Public Shared CurrentUser As String 

End Class 

Vous pouvez y accéder en utilisant le nom Forms:

Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 
    HomeForm.CurrentUser = UsernameTextBox.text 
End Sub 

* Si vous cherchez à économiser cette valeur entre exécution de l'application, puis ajoutez une valeur « CurrentUser » dans le projet -> Propriétés -> Paramètres, puis utilisez le code comme:

Private Sub btnOK_Click(sender As System.Object, e As System.EventArgs) Handles btnOK.Click 
    My.Settings.CurrentUser = UsernameTextBox.text 
    My.Settings.Save() 
End Sub 

Vous pouvez récupérer la valeur de l'utilisation partout: My.Settings.CurrentUser

+2

'CurrentUser' gardera sa valeur même si elle n'est * pas *' Shared', tant que la même instance 'HomeForm' est accédée. –

+1

Vous devez vraiment comprendre les implications des objets partagés avant de les utiliser. Ils fonctionnent de la même manière que les globaux et sont rarement un bon endroit pour stocker des informations. – Basic

+0

D'accord; tant que vous accédez à la ** même ** instance. L'approche ** Shared ** fonctionnera même si cette instance est supprimée. Il donne également une belle variable _global_ accessible depuis ** n'importe où ** sans avoir besoin de passer une référence. Tout dépend de la façon dont vous envisagez d'utiliser cette valeur, je suppose ... =) –

0
Dim onearray() As String 
Dim i As Integer 
Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click 
Home.CurrentUser = UsernameTextBox.text 
Home.CurrentUser = onearray(i) 
i = i + 1 
End Sub 
+0

Vous voulez vous expliquer? – Neolisk

0

Cela dépend de la manière dont vous appelez votre formulaire à partir du formulaire de connexion que vous avez décrit. L'appeler avec la méthode show disposera le formulaire après que l'utilisateur ferme le formulaire. S'il vous plaît voir les commentaires ci-dessous pour les explications et le comportement que cela peut causer. Selon MSDN The Closing event se produit lorsque le formulaire est en cours de fermeture. Lorsqu'un formulaire est fermé, toutes les ressources créées dans l'objet sont libérées et le formulaire est supprimé.

Basé sur un examen plus approfondi, il est possible de lire une variable simple même si le formulaire est disposé. Cependant, à mon avis, j'approcherais les données nécessaires en passant un objet ou une variable comme indiqué ci-dessous.

Il y a plusieurs façons dont vous pouvez persister ou enregistrer les informations de l'utilisateur actuel afin d'accéder en toute sécurité plus tard. En voici un.

  1. Créez une classe appelée CurrentUser et donnez-lui les propriétés publiques de base que vous pouvez obtenir et définir.
  2. Ajoutez un nouveau constructeur à HomeForm et transmettez une référence d'argument byref du nouvel objet CurrentUser.
  3. Définir ou obtenir les informations nécessaires à partir de l'objet CurrentUser
  4. Lorsque le formulaire se ferme, les informations nécessaires à partir de l'objet CurrentUser sont transmises au formulaire. Assurez-vous que la portée de cet objet est disponible pour d'autres parties de votre objet. (C.-à en faire une propriété publique sous la forme qui appelle la forme d'accueil.)

    dim ouser as new CurrentUser 
    dim frmHomeForm as new HomeForm(ouser) 
    frmHomeForm.show 
    msgbox(ouser.Name) 
    

Si vous souhaitez enregistrer la valeur après que l'utilisateur ferme l'application, vous pouvez ajouter un paramètre dans les propriétés du projet , et il suffit de se référer à My.Settings.YourSettingName au lieu d'utiliser une variable pour obtenir et définir le nom de connexion des utilisateurs.

+1

Tout cela est faux. Lorsqu'un formulaire est fermé, il n'est pas libéré et n'est pas éliminé. Toutes les propriétés sont disponibles jusqu'à ce que le formulaire soit éliminé, ce qui arrivera à un moment donné étant donné le code dans cette réponse. C'est pourquoi vous utilisez 'Using 'lorsque vous travaillez avec des formulaires pour contrôler le moment de disposer:' En utilisant f comme nouveau LoginForm: f.ShowDialog(): MsgBox (f.AProperty): End Using'. 'AProperty' est accessible malgré la fermeture du formulaire. – GSerg

+0

@GSerg: Même après que le formulaire a été éliminé (en utilisant la méthode 'Dispose'), les propriétés personnalisées ou les champs comme le champ' CurrentUser' de la question conservent leurs valeurs. –

+0

@ O.R.Mapper Techniquement oui, bien qu'en réalité ils s'arrêtent de travailler parce que plus souvent qu'autrement ils examinent les propriétés des contrôles de formulaire qui lancent maintenant 'DisposedException'. – GSerg

2

Tant que vous accédez à la même instance de votre HomeForm classe, les valeurs des variables sera toujours là pour vous d'accéder après que l'utilisateur a fermé la forme.

Ceci s'applique à tous les champs ou propriétés qui n'accèdent à aucune des propriétés ou méthodes héritées de la classe Form. Ces méthodes de Form peuvent dépendre des ressources internes qui sont en effet libérées lors de la fermeture ou de l'élimination du formulaire, tandis que les propriétés CLR simples resteront intactes aussi longtemps que l'instance est dans la portée.

+0

L'esprit downvoterait-il d'expliquer quelle était la raison de la downvote? –

+0

Désolé, penser à la réponse et à cette question. Il suppose que la portée de HomeForm est toujours disponible ou globale. Peu importe votre réponse a un sens pour la question. Il ne me laissera pas upvote à moins d'y mettre un edit. – SoftwareCarpenter

+0

De toute façon vous pouvez mettre un espace ou quelque chose dans votre réponse, donc je le change en un upvote? – SoftwareCarpenter

Questions connexes