如何通过c#中的事件处理程序传递类的实例



所以我只是想知道事件处理程序是如何工作的。

我有一个WinForms应用程序,它在主窗体上有一个面板控件。我用登录页面填充面板。登录页面将在数据库中搜索用户,并在用户单击登录按钮时检查密码是否正确。如果登录详细信息正确,它就会触发事件处理程序,告诉主表单登录成功。然后,它应该将Users详细信息存储在主表单中,以便在面板中填充下一个控件时使用。当用户登录时,它创建一个名为user的类的实例。我如何将该User传递回主表单,以便它知道当前登录的是哪个用户?

我希望这有意义。

在ctrl:

public partial class ctrlLoginPage : UserControl
{
public event EventHandler RegisterButtonClicked;
public event EventHandler LoginButtonClicked;
public User activeUser = new User();
public ctrlLoginPage()
{
InitializeComponent();
}
private void btnRegister_Click(object sender, EventArgs e)
{
RegisterButtonClicked(this, e);
}
public void btnLogon_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection();
con.ConnectionString = "server=DESKTOP-05NVBR2\SQLEXPRESS;database=GymAppPrototype;UID=sa;password=Mabg123";
con.Open();
SqlDataReader dataReader = null;
SqlCommand myCommand = new SqlCommand("select * from Customer where Email ='" + txtEmail.Text + "';", con);
dataReader = myCommand.ExecuteReader();
while (dataReader.Read())
{
activeUser.forename = dataReader["Forename"].ToString();
activeUser.surname = dataReader["Surname"].ToString();
activeUser.email = dataReader["Email"].ToString();
activeUser.password = dataReader["Password"].ToString();
activeUser.mobile = dataReader["MobileNumber"].ToString();
}
con.Close();
if (txtPassword.Text == activeUser.password)
{
MessageBox.Show("Login Successful");
LoginButtonClicked(this, e);
}
else
{
MessageBox.Show("Login Failed");
}

}

}

这完全取决于你如何设计你的类和它们的集成,但是根据上面的例子,你可以使用自定义EventArgs,或者更好的是自定义eventandler。

不要传递'e'给'LoginButtonClicked'事件。而是使用包含登录用户数据的自定义事件参数类。为此,您需要定义一个不同的事件处理程序:

event EventHandler<MyEventArgs> LoginButtonClicked;

然后定义你的事件参数类:

public class MyEventArgs : EventArgs{
public MyEventArgs(User activeUser) {
ActiveUser = activeUser;
}
public User ActiveUser { get; }
}

现在你可以传递一个新类的新实例而不是'e':

LoginButtonClicked(this, new MyEventArgs(activeUser));

事件的订阅者可以使用e.ActiveUser来访问登录的用户信息,例如:

myLoginPanel.LoginButtonClicked += (s, e) => { /* do something with e.ActiveUser */ };

虽然完全有可能在应用程序中使用标准的基于事件的消息传递,但我怀疑在这里是否有必要这样做。根据您的工作流程,可能最简单的方法是显示不同的表单并阻塞,直到用户登录/注册,或者取消它:

//MainForm
public void GetUser()
{
using var userWindow = new UserForm();
if (userWindow.ShowDialog(this) == DialogResult.OK)
{
return userWindow.SelectedUser;
}
return null;
}
//UserForm
public class UserForm : Form
{
public User SelectedUser { get; private set; }
private void btnRegister_Click(object sender, EventArgs e)
{
SelectedUser = // registration logic
DialogResult = DialogResult.OK;
Close();
}
private void btnLogon_Click(object sender, EventArgs e)
{
SelectedUser = // logon logic
DialogResult = DialogResult.OK;
Close();
}
private void btnCancel_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.Cancel;
Close();
}
}

相关内容

最新更新