如何在Winforms应用程序中维护用户登录详细信息?

嗨我可以对Windows窗体很新。 在这里,我想在Windows窗体中维护状态(如Web应用程序中的会话)。

实际上我想在会话中存储用户登录详细信息。 但我认为在winforms中没有会话的概念。 那么处理这种情况的替代方法是什么呢?

此致,Nagu

Windows窗体中没有Session变量的概念。 你能做的是:

  1. 创建一个内部类,其中包含用户名和密码以及整个应用程序所需的任何其他变量和枚举(类似于Common.cs)。 这些可以通过整个应用程序的公共属性访问。

  2. 为所有表单设置参数化构造函数,并在显示表单时发送用户名和密码。

public class MyForm : Form { private string userName; private string password; } 

由于Windows窗体是statefull(与Web窗体的无状态相对),因此您只需在Form类中使用一个字段即可。

在winforms中,您可以使用通过方法或属性向其他表单公开的变量。

您还可以使用静态变量

在以下示例中,您将为每个窗口或一组窗口配备一个控制器。 控制器将根据他们需要协作的方式(他们需要分享的知识等)相互传递。 重要的是将应用程序状态保持在控制器中并限制窗口以处理用户输入和事件。

 // pseudocode, because I do not know WinForms that much class MainController { private Guid securityToken; public Guid SecurityToken { get { return securityToken; } set { securityToken = value; } } } class LoginWindowController { MainController mainController; LoginWindow loginWindow; public LoginWindowController(MainController mainController) { this.loginWindow = new LoginWindow(this); this.mainController = mainController; } public void Show() { loginWindow.IsVisible = true; } public void HandleLogin() { Guid token = myobject.Authenticate(loginWindow.Username, loginWindow.Password); if (token != Guid.Empty) { mainController.SecurityToken = token; } } } 

你需要在范围方面考虑更多而不是会话; 只要对象保留在范围内,您就可以从其公共属性/字段中提取值。

在您的情况下,将用户详细信息存储在静态类中是有意义的:

 public static class LoginInfo { public static string UserID; } 

现在,您只需从代码中的任何位置访问UserID:

 MessageBox.Show(LogInfo.UserID); 

在回复您对我的第一个回复的评论时:

您正在创建Login表单的实例。 那怎么会有价值。 这是一个登录表单,因此我相信您将关闭它,因为用户输入用户名和密码并单击“确定”或其他任何内容。

然后,在关闭时,您无法从Login表单中获取值。 如果你需要坚持这种方法,这可能是一种方式:

  1. 不要关闭登录表单,只需隐藏它。
  2. 将当前实例传递给下一个表单。 像这样:在登录表格中:

    NextForm nxt = new NextForm(this);

NextForm的构造函数如下所示:

 public NextForm(LoginForm frm){ // Code here } 

现在在NextForm中,您可以通过“frm”访问属性。

来自我使用登录表单存储全局变量并将密码存储为安全字符串的程序。 在程序中,当我调用进程时,我能够“运行”为特定用户。 除了process.start之外,您还可以将它用于其他内容。

 //to run process as another user //create these global variables on the first //form or piece of code in your program class usernameGlobalVariable { public static string var = ""; } class passwordGlobalVariable { public static SecureString var; } // use these as event handlers for text fields //for your login form private void usernameTextBox_TextChanged(object sender, EventArgs e) { usernameGlobalVariable.var = usernameTextBox.Text; } private void passwordTextBox_TextChanged(object sender, EventArgs e) { SecureString passWord = new SecureString(); foreach (char c in passwordTextBox.Text.ToCharArray()) { passWord.AppendChar(c); } passwordGlobalVariable.var = passWord; } //put this on form that launches program //this assigns variables for process.start //change fileName to path and name of program // use \\ in paths string fileName = "c:\\hdatools\\Ping2.exe"; string arguments = ""; string domain = "domain"; //start the process //put this on the page along w the above variables that //launches the app as another user //the .var variables are global { Process.Start( fileName, arguments, usernameGlobalVariable.var, passwordGlobalVariable.var, domain); } 

根据您的一个回复,我不清楚您是在谈论Web应用程序还是应用程序。 如果您正在讨论Web应用程序,则可以使用Page对象上的Session属性。

它会设置如下变量:

 Session["username"] = "Username"; Session["fullname"] = "User's full name"; 

然后您可以访问:

 lblGreetings.Text = "Hi " + Session["fullname"]; 

这就是你追求的吗?