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

C# 如何在Winforms应用程序中维护用户登录详细信息?,c#,winforms,C#,Winforms,你好,我对windows窗体很陌生。这里我想在windows窗体中维护状态(如web应用程序中的会话) 实际上,我想在会话中存储用户登录详细信息。但我认为winforms中没有会话的概念。那么,处理这种情况的替代方法是什么呢 问候,, Nagu在winforms中,您可以使用通过方法或属性向其他表单公开的变量 您还可以使用静态变量 由于windows窗体是有状态的(与web窗体的无状态相反),因此您可以在窗体类中使用一个字段。我不清楚您所说的是web应用程序还是基于某个响应的备用应用程序。如果您

你好,我对windows窗体很陌生。这里我想在windows窗体中维护状态(如web应用程序中的会话)

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

问候,,
Nagu

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

您还可以使用静态变量


由于windows窗体是有状态的(与web窗体的无状态相反),因此您可以在窗体类中使用一个字段。

我不清楚您所说的是web应用程序还是基于某个响应的备用应用程序。如果您谈论的是web应用程序,则可以使用页面对象上的会话属性

它将如下设置变量:

Session["username"] = "Username";
Session["fullname"] = "User's full name";
然后您可以访问以下内容:

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

这就是您想要的吗?

windows窗体中没有会话变量的概念。您可以做的是:

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

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


  • 关于你对我第一次答复的评论:

    您正在创建登录表单的新实例。这怎么会有价值呢。这是一个登录表单,因此我相信当用户输入用户名和密码并单击OK或其他什么时,您将关闭它

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

  • 不要关闭登录表单,只需将其隐藏
  • 将当前实例传递到下一个窗体。这样地: 以登入形式:

    NextForm nxt=新的NextForm(本)

  • NextForm的构造函数如下所示:

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

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

    在下面的示例中,每个窗口或窗口组都有一个控制器。控制器之间的传递取决于他们需要如何协作(他们需要共享什么知识等)。重要的是将应用程序状态保留在控制器中,并限制窗口处理用户输入和事件

    // 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;
    }
    
    现在,您可以从代码中的任意位置访问用户ID:

    MessageBox.Show(LogInfo.UserID);
    

    从一个程序中,我使用一个登录表单来存储全局变量,并将密码存储为一个安全字符串。在程序中,当我调用进程时,我能够作为特定用户“运行”。除了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);
    }
    

    谢谢,但在这里我如何设置启动页面?我想在成功验证后将login.aspx设置为starup页面我想重定向到主页WOA@纳古:我想知道你是如何在winform应用程序中使用aspx的?login.aspx?您正在创建web应用程序吗?抱歉,只是它的login.cs only我可以在应用程序的所有其他页面中使用此值吗?如果是这样,我如何在home.cs页面中获取用户名和密码?那么您需要将字段设置为内部字段或添加属性以公开它们。但我仍然面临同样的问题。。我在login.cs中声明了两个变量,比如公共字符串loginid=“123456”;之后,我尝试访问home.cs,比如login lg=new login()MessageBox.Show(lg.loginid);它正在显示空值。。问题是什么problem@Danish-你能提供任何结构吗?这篇文章是关于windows窗体的,而不是关于web应用程序的。这不适用于仅在web应用程序中有效的winforms
    //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);
    }