我有一个处理用户登录的对象。该对象有一个名为LoginPopUp()的方法,它调用Login.show()来显示Login窗体/窗口。
表单/窗口是一个单独的对象。当用户输入他们的详细信息并按下提交时,我希望表单将数据传递回调用对象。然后,调用对象(处理登录的对象)将验证用户名和密码。如果用户在数据库中,它将关闭窗口。
如果用户不在数据库中,它将保持打开状态并显示“登录错误”。所以我需要一种方法让调用对象将信息传递回登录窗口,告诉它失败了。
我对如何做到这一点感到困惑。这是回调和授权的情况吗?什么是传统解决方案在这种情况下使用?我想这会发生很多事情。
评论赞赏。
答案 0 :(得分:1)
您可以使用委托(也称为回调)执行此操作。拥有调用者可以设置的登录表单的委托类型属性。您也可以使用事件(实际上也是委托)来执行此操作,并使登录表单显示调用者在显示表单之前可以订阅的事件。
但是,如果在登录后总是采取相同的操作,那么直接调用而不是使用代理可能会更直接。
答案 1 :(得分:1)
你的方法会奏效。
另一个简单的选择是将对用户验证器的引用传递给登录窗口
使验证功能静止。
在这里做你想要的是一个前任。 只需使用文本框和form2创建form1,其中包含两个文本框和一个要运行的按钮。
namespace TestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public bool DoValidate(string username, string password)
{
MessageBox.Show(string.Format("I got called with {0} : {1}",username,password));
return true;
}
private void button1_Click(object sender, EventArgs e)
{
Form2 F = new Form2(DoValidate);
F.ShowDialog();
}
}
}
namespace TestApp
{
public partial class Form2 : Form
{
private Form2()
{
InitializeComponent();
}
public delegate bool LoginFn(string Uname, string pword);
private LoginFn m_CallFn;
public Form2(LoginFn del)
{
InitializeComponent();
m_CallFn = del;
}
private void cmdLogon_Click(object sender, EventArgs e)
{
if (!m_CallFn(txtUser.Text, txtPassword.Text))
{
MessageBox.Show("Fail");
}
else
{
MessageBox.Show("Good");
}
}
}
}
答案 2 :(得分:1)
你可以通过多种方式实现这一目标
使用活动
public class FormTest:Form
{
public delegate int validateLogin(string userID,string Password);
public validateLogin validate;
public event validateLogin validateEvent;
public void submitWithcallback()
{
string userId=string.Empty,pwd=string.Empty;
validate(userId, pwd);
}
public void submitWithFuncDelegate(Func<string,string,int> funcDelegate)
{
string userId = string.Empty, pwd = string.Empty;
funcDelegate(userId, pwd);
}
public void submitWithEvent()
{
string userId = string.Empty, pwd = string.Empty;
validateEvent(userId, pwd);
}
}
并从你的班级中调用
public class Test
{
static int validate(string uid, string pwd)
{
//your validation code
return 1;
}
void testValidate()
{
Func<string, string, int> validateFunc = (uid, pwd) =>
{
//your validation code
return 1;
};
FormTest.validateLogin vDel = new FormTest.validateLogin(validate);
FormTest v1 = new FormTest();
v1.validate = new FormTest.validateLogin(vDel);
v1.submitWithcallback();
v1.submitWithFuncDelegate(validateFunc);
v1.validateEvent += new FormTest.validateLogin(validate);
//or with anonymous functions
v1.validateEvent += (string uid,string pwd)=>{
//your validation code
return 1;
};
v1.submitWithEvent();
}
}
答案 3 :(得分:0)
LoginSubmitted
,其中包含包含登录名和密码的事件参数ShowLoginFailed()
LoginSubmitted
事件,并通过从事件参数中读取登录名和密码并检查数据库来处理它Login
,否则请致电ShowLoginFailed()
答案 4 :(得分:0)
回调/关闭在这里运作良好。
也许一个片段有助于解释。
bool CheckUser(string user, string pass) { ... }
...
void ShowLogin(Func<string,string,bool> check)
{
var f = new LoginForm();
f.LoginClick += delegate
{
if (check(f.User, f.Pass))
{
f.Close();
}
};
f.ShowDialog();
}
用法:
ShowLogin(CheckUser);