嗨,我可以对Windows窗体很新。在这里,我想在Windows窗体中维护状态(如Web应用程序中的会话)。
实际上我想在会话中存储用户登录详细信息。但我认为winforms中没有会话概念。那么处理这种情况的替代方法是什么呢?
此致 纳古
答案 0 :(得分:5)
Windows窗体中没有Session变量的概念。你能做的是:
创建一个内部类,其中包含用户名和密码以及整个应用程序所需的任何其他变量和枚举(类似于Common.cs)。这些可以通过整个应用程序中的公共属性访问。
为所有表单设置参数化构造函数,并在显示表单时发送用户名和密码。
答案 1 :(得分:3)
public class MyForm : Form
{
private string userName;
private string password;
}
由于Windows窗体是statefull(与Web窗体的无状态对立),您可以在Form类中使用一个字段。
答案 2 :(得分:1)
在winforms中,您可以使用通过方法或属性向其他表单公开的变量。
您还可以使用 静态变量 。
答案 3 :(得分: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;
}
}
}
答案 4 :(得分:1)
你需要考虑范围而不是会话;只要对象保留在范围内,您就可以从其公共属性/字段中提取值。
在您的情况下,将用户详细信息存储在静态类中是有意义的:
public static class LoginInfo
{
public static string UserID;
}
现在,您只需从代码中的任何位置访问UserID:
MessageBox.Show(LogInfo.UserID);
答案 5 :(得分:0)
回复你对我的第一个回复的评论:
您正在创建“登录”表单的新实例。那怎么会有价值。这是一个登录表单,因此我相信您将关闭它,因为用户输入用户名和密码并单击“确定”或其他任何内容。
然后,在关闭时,您无法从Login表单中获取值。如果你需要坚持这种方法,这可能是一种方式:
将当前实例传递给下一个表单。像这样: 在登录表单中:
NextForm nxt = new NextForm(this);
NextForm的构造函数如下所示:
public NextForm(LoginForm frm){
// Code here
}
现在在NextForm中,您可以通过“frm”访问属性。
答案 6 :(得分:-1)
来自我使用登录表单存储全局变量并将密码存储为安全字符串的程序。在该计划中,我能够以"我调用进程时的特定用户。除了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);
}
答案 7 :(得分:-3)
我不清楚您是在谈论基于您的某个回复的网络应用程序还是站在应用程序中。如果您正在讨论Web应用程序,则可以使用Page对象上的Session属性。
它会设置如下变量:
Session["username"] = "Username";
Session["fullname"] = "User's full name";
然后您可以访问:
lblGreetings.Text = "Hi " + Session["fullname"];
那是你所追求的吗?