【发布时间】:2012-07-16 04:55:32
【问题描述】:
好的,在用户成功登录后,一个警告框会显示用户名,然后会弹出另一个表单,让用户可以更改他的密码。我想在条件语句中使用用户名的值(来自登录表单)来更改密码。
我如何获得来自另一个表单的这个值?谢谢。
在此处查看图片:
【问题讨论】:
-
一种方法是在登录表单中使用公共属性作为您可以在其他表单中访问的用户名。
好的,在用户成功登录后,一个警告框会显示用户名,然后会弹出另一个表单,让用户可以更改他的密码。我想在条件语句中使用用户名的值(来自登录表单)来更改密码。
我如何获得来自另一个表单的这个值?谢谢。
在此处查看图片:
【问题讨论】:
什么让你感到困惑? 将用户名传递给下一个表单,我看不出第 3 个表单必须知道其他任何信息的原因。这将是一种无用的依赖。
【讨论】:
一种方法是在登录表单中使用公共属性作为用户名,您可以在其他表单中访问该用户名。
例如:
在 LoginForm 中,创建一个公共属性
public string UserName { get; private set;}
在 LoginForm 中填写该属性并将其传递给其他表单。在创建第二种形式的对象时,您可以从第一种形式访问数据,然后将其传递给其他形式的属性/构造函数。
例如,
FacultyForm facultyForm=new FacultyForm();
facultyForm.UserName = loginForm.UserName; //in this case you have to create a property in other form too.
这只是其中一种方法。
这能解决问题吗?
另一种方法是使用委托/事件。
【讨论】:
将登录表单的用户名文本框设为公开,以便您可以从任何其他表单访问。
您可以更改 LoginForm.designer.cs 中的代码
【讨论】:
您可以创建一个Custom Event,它将在成功登录时提出,您可以使用CustomEventArgs 传递信息,然后在您启动第二个表单时使用它。
类似这样的:
Form1
public partial class Form1 : Form
{
Logon logon;
PasswordChange pass;
public Form1()
{
InitializeComponent();
logon = new Logon();
logon.raiseLoginEvent += new Logon.LoginSuccesful(logon_raiseLoginEvent);
logon.ShowDialog();
}
void logon_raiseLoginEvent(object sender, LoginEventArgs e)
{
pass = new PasswordChange();
pass.LoginName = e.Login;
pass.ShowDialog();
}
}
登录
public partial class Logon : Form
{
public delegate void LoginSuccesful(object sender, LoginEventArgs e);
public event LoginSuccesful raiseLoginEvent;
public Logon()
{
InitializeComponent();
}
private void Logon_FormClosing(object sender, FormClosingEventArgs e)
{
LoginEventArgs ev = new LoginEventArgs("Admin");
raiseLoginEvent(this, ev);
}
}
public class LoginEventArgs : EventArgs
{
public LoginEventArgs(string s)
{
loginName = s;
}
private string loginName;
public string Login
{
get { return loginName; }
set { loginName = value; }
}
}
密码更改
public partial class PasswordChange : Form
{
public PasswordChange()
{
InitializeComponent();
}
public string LoginName
{
get {return textBox1.Text; }
set { textBox1.Text = value; }
}
}
【讨论】: