有没有办法在另一个类中创建事件处理程序代码并调用它



我想创建一个以 M V C 模式的小项目,我想将我的代码分成三部分。

我在一个部分使用了模型,在另一个部分使用了视图控制器,但现在我也想分离控制器。

这是来自事件,现在我想在控制器中使用它,然后在这里调用它:

public void button1_Click(object sender, EventArgs e)
{
try
{
string query = "Select * from [UserTbl] where username='" + txtusername.Text + "' and password='" + txtpassword.Text + "'";
DBConnect db = new DBConnect();
DataTable dt = db.GetData(query);
if (dt.Rows.Count > 0)
{
MessageBox.Show("Login successful");
}
else
{
MessageBox.Show("Username and Password Incorrect");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

这是控制类

public class LoginControl
{

}

在其最简单,最字面的形式中,

public class Authentication
{
public void Login(string userName, string password)
{
try
{
string query = "Select * from [UserTbl] where username='" + userName + "' and password='" + password + "'";
DBConnect db = new DBConnect();
DataTable dt = db.GetData(query);
if (dt.Rows.Count > 0)
{
MessageBox.Show("Login successful");
}
else
{
MessageBox.Show("Username and Password Incorrect");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
public void button1_Click(object sender, EventArgs e)
{
var authentication = new Authentication();
authentication.Login(txtusername.Text, txtpassword.Text);
}

我回避了这样一个事实,即除了显示结果之外,这似乎没有任何作用。大概您正在执行此代码中未看到的其他操作。此外,通过连接用户 ID 和密码来创建 SQL 会产生严重的 SQL 注入风险,因此应改用参数。

如果该方法绝对只打算在此单个应用程序的上下文中使用,则这可能就足够了。但是,如果您希望它在MessageBox.Show不可用的某些上下文中可用,该怎么办?也许您希望能够在任何 Windows 窗体应用之外重用此登录代码(如果我们能够最大程度地减少绑定到任何 UI 的代码量,那就太好了。

您可以通过让方法返回结果来分隔它。这样,该方法将指示某些内容是否成功,并且 UI 代码确定是否或如何将其传达给用户。在这种情况下,您的方法可能更像这样:

public bool Login(string userName, string password)
{
string query = "Select * from [UserTbl] where username='" + userName + "' and password='" + password + "'";
DBConnect db = new DBConnect();
DataTable dt = db.GetData(query);
if (dt.Rows.Count > 0)
{
return true;
}
else
{
return false;
}
// or, just
// return dt.Rows.Count > 0;
}

在许多情况下,返回某种具有更多详细信息的Result类是有意义的,但对于此示例,表示成功或失败的bool就足够了。

现在,您的 UI 代码可以执行此操作:

public void button1_Click(object sender, EventArgs e)
{
try
{
var authentication = new Authentication();
var success = authentication.Login(txtusername.Text, txtpassword.Text);
if (success)
{
MessageBox.Show("Login successful");
}
else
{
MessageBox.Show("Username and Password Incorrect");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}

如果需要重用上述代码并且不想复制它,则可以创建一个单独的控件,将按钮和单击处理程序都移动到其中。

我假设这是WinForms?

您可以向LoginControl添加一个公共函数,只需从button1_Click事件处理程序调用它。

您将无法访问LoginControl中的表单控件,因此您必须将所需的值从表单的控件传递到您编写的函数。您的函数可以返回一些内容来指示登录是否成功,这样您就可以显示来自button1_Click事件处理程序的正确消息。

最新更新