你好,我非常新手在使用Windows Forms。我想在Windows Forms中维护状态(类似于Web应用程序中的会话)。
实际上,我想在会话中存储用户登录详细信息。但我认为在WinForms中没有会话的概念。那么处理这种情况的替代方法是什么呢?
谢谢, Nagu
在Windows Forms中没有Session变量的概念。你可以这样做:
创建一个内部类来保存用户名称、密码和应用程序中需要的任何其他变量和枚举(类似于Common.cs)。这些可以通过公共属性在整个应用程序中访问。
为所有表单创建参数化构造函数,并在显示表单时发送用户名和密码。
public class MyForm : Form
{
private string userName;
private string password;
}
由于Windows窗体是有状态的(与Web表单无状态相对),因此您可以在Form类中使用字段。
public static class LoginInfo
{
public static string UserID;
}
MessageBox.Show(LogInfo.UserID);
// 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;
}
}
}
回复您对我的第一条回复的评论:
您正在创建登录表单的新实例。这样怎么可能有值呢?它是一个登录表单,因此我认为您将在用户输入用户名和密码并单击“确定”或其他按钮后关闭它。
然后,由于登录表单已关闭,您无法获取其值。如果您需要坚持这种方法,可以尝试以下方式:
将当前实例传递给下一个表单。像这样:
在登录表单中:
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"];
这是你想要的吗?