我需要帮助来调用函数,同时在单击按钮时将字符串从一个窗体传递到另一个窗体。
Form1(Form1)有MySQL连接和验证登录所需的“Select”语句。
Form2(loginwindows)有登录用户和密码文本框以及登录按钮。
我得到的错误是:“无法隐式地将类型'void'转换为'Application.Main.App.Form1.MyFunctionExposed'”
以下是我所拥有的:
表格1.cs:
namespace Application.Main
{
public partial class Form1 : Form
{
public string strUser;
public string strPass;
public delegate void MyFunctionExposed();
public static MyFunctionExposed functionMySQLCheckLogin;
public Form1()
{
InitializeComponent();
functionMySQLCheckLogin = CheckLogin(strUser, strPass);
}
//Check Login
public void CheckLogin(string strUser, string strPass)
{
try
{
//Open connection
string query = "SELECT * FROM users WHERE user_name = '" + strUser + "' AND user_password = '" + strPass + "' ";
//Create Command
MySqlCommand cmd = new MySqlCommand(query, connection);
//Create a data reader and Execute the command and the rest of the MySQL query code
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
}
表格2.cs
namespace Application
{
public partial class LoginWindow : Form
{
public LoginWindow()
{
InitializeComponent();
}
private void LoginWindow_Load(object sender, EventArgs e)
{
}
private void btnLoginGo_Click(object sender, EventArgs e)
{
Application.Main.Form1.functionMySQLCheckLogin(inputBoxLoginUser.Text, inputBoxLoginPassword.Text);
}
}
有什么办法可以解决这个问题,或者用这两种形式做得不同吗?
谢谢。
最佳答案
要编译它,您只需要获得正确的参数-将(string, string)
签名添加到委托,静态的赋值是给方法组(即不调用函数):
public delegate void MyFunctionExposed(string user, string pass);
public static MyFunctionExposed functionMySQLCheckLogin;
public Form1()
{
InitializeComponent();
functionMySQLCheckLogin = CheckLogin;
}
但是,可能出现这种情况的原因是您希望重用代码。如果是这样,我会考虑重构并将
CheckLogin
代码移到一个更合适的类中,例如一个公共助手、数据访问,甚至是一个基表单类(如果它要被多个表单使用)。另一种选择是使
CheckLogin
方法成为静态的(因为它不依赖于Form1
字段的状态)-这样您就可以从任何地方调用它作为Form1.CheckLogin(.., ..)
最后一件事-请看现在的sql查询,它很容易受到sql注入攻击,登录屏幕是最喜欢的目标。