有没有一种方法可以在另一个类中创建事件处理程序代码,然后调用它

时间:2019-06-07 13:50:17

标签: c#

我想用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
    {


    }

2 个答案:

答案 0 :(得分:1)

以最简单,最文字的形式

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 Forms应用程序之外重用此登录代码。 (如果我们可以减少与任何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);
    }
}

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

答案 1 :(得分:0)

我假设这是WinForms吗?

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

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