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

7

你好,我非常新手在使用Windows Forms。我想在Windows Forms中维护状态(类似于Web应用程序中的会话)。

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

谢谢, Nagu

8个回答

6

在Windows Forms中没有Session变量的概念。你可以这样做:

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

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


我仍然面临着同样的问题...我在login.cs中声明了两个变量,如public string loginid = "123456";之后我尝试在home.cs中访问,如login lg = new login() MessageBox.Show(lg.loginid);它显示为空值..问题出在哪里? - Nagu
@Danish - 你能提供任何结构吗? - Sunil Acharya

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

由于Windows窗体是有状态的(与Web表单无状态相对),因此您可以在Form类中使用字段。


我可以在应用程序的所有其他页面中使用这些值吗?如果可以,那么我如何在home.cs页面中获取用户名和密码? - Nagu
那么你需要将字段设置为内部的,或者添加属性来公开它们。 - Paul van Brenk

2
你需要更多地考虑对象的范围而非会话;只要一个对象仍然在范围内,你就可以从它的公共属性/字段中提取值。
在你的情况下,将用户详细信息存储在静态类中是有意义的:
public static class LoginInfo
{
    public static string UserID;
}

现在您可以轻松地从代码中的任何位置访问用户ID:
MessageBox.Show(LogInfo.UserID);

1
在下面的例子中,您将为每个窗口或窗口组拥有一个控制器。根据它们需要如何协作(需要共享什么知识等),控制器将相互传递。重要的是将应用程序状态保留在控制器中,并将窗口限制为处理用户输入和事件。
// 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;
        }   
    }
}

1
在WinForms中,您可以使用通过方法或属性公开给其他窗体的变量。
您还可以使用静态变量。

谢谢,但我该如何设置启动页面?我想在成功验证后将login.aspx设置为启动页面,然后重定向到主页。 - Nagu
1
哇!@Nagu:我想知道你是如何在WinForm应用程序中使用aspx的? - Hemant
login.aspx?您正在创建一个Web应用程序吗? - rahul
抱歉,只是它的 login.cs。 - Nagu

0

回复您对我的第一条回复的评论:

您正在创建登录表单的实例。这样怎么可能有值呢?它是一个登录表单,因此我认为您将在用户输入用户名和密码并单击“确定”或其他按钮后关闭它。

然后,由于登录表单已关闭,您无法获取其值。如果您需要坚持这种方法,可以尝试以下方式:

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

    在登录表单中:

    NextForm nxt = new NextForm(this);

NextForm的构造函数如下:

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

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


0

我使用一个带有登录表单的程序来存储全局变量和将密码存储为安全字符串。在程序内,当我调用进程时,我可以“以特定用户身份运行”。你可以将它用于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);
}

-4

根据您的回复,我不确定您是在谈论基于Web应用程序还是独立应用程序。如果您是在谈论Web应用程序,您可以使用Page对象上的Session属性。

设置变量的方法如下:

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

然后你可以像这样访问:

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

这是你想要的吗?


这篇文章是关于Windows窗体,而不是Web应用程序的。 - Bhaskar
仅适用于 Web 应用程序,不适用于 WinForms。 - Sunil Acharya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接