C#这是授权和回调的情况吗?
我有一个处理用户登录的对象。此对象有一个名为LoginPopUp()的方法,该方法调用Login.show()以显示登录表单/窗口 窗体/窗口是一个单独的对象。当用户输入其详细信息并按submit时,我希望表单将数据传递回调用对象。然后,调用对象(处理登录的对象)将验证用户名和密码。如果用户在数据库中,它将关闭窗口 如果用户不在数据库中,它将保持打开状态并显示“不正确登录”。所以我需要一种方法,让调用对象将信息传递回登录窗口,告诉它它失败了 我对怎么做有点困惑。这是回调和委托的情况吗?在这种情况下,传统的解决方案是什么?我想这种情况经常发生C#这是授权和回调的情况吗?,c#,C#,我有一个处理用户登录的对象。此对象有一个名为LoginPopUp()的方法,该方法调用Login.show()以显示登录表单/窗口 窗体/窗口是一个单独的对象。当用户输入其详细信息并按submit时,我希望表单将数据传递回调用对象。然后,调用对象(处理登录的对象)将验证用户名和密码。如果用户在数据库中,它将关闭窗口 如果用户不在数据库中,它将保持打开状态并显示“不正确登录”。所以我需要一种方法,让调用对象将信息传递回登录窗口,告诉它它失败了 我对怎么做有点困惑。这是回调和委托的情况吗?在这种情况
感谢您的评论。您可以通过代理(也称为回调)完成此操作。具有调用方可以设置的登录表单的委托类型属性。您还可以使用事件(实际上也是一个委托)执行此操作,并让登录表单在显示表单之前公开调用者可以订阅的事件 但是,如果登录后总是执行相同的操作,那么直接调用可能比使用委托更简单。
- 在登录表单上公开事件,如带有包含登录名和密码的事件参数的
LoginSubmitted
- 在登录表单上公开方法,如
ShowLoginFailed()
- 订阅控制对象中的
事件,并通过从事件参数读取登录名和密码并检查数据库来处理它LoginSubmitted
- 如果登录成功,请关闭
,否则调用login
ShowLoginFailed()
- 你的方法会奏效的
另一个简单的选项是将对用户验证器的引用传递到登录窗口
将验证函数设置为静态
在这里做你想做的事是一个前男友。
只需创建带有文本框的form1和带有两个文本框和一个要运行的按钮的form2
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");
}
}
}
}
回调/闭包在这里可以很好地工作 也许一个片段可以帮助解释
bool CheckUser(string user, string pass) { ... }
你可以通过多种方式实现这一点
- 使用代理回调
- 使用func委托(内联匿名方法)
- 使用事件
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); } }
公共类FormTest:Form { 公共委托int validateLogin(字符串用户ID、字符串密码); 公共验证; 公共事件验证登录验证事件; 公共无效submitWithcallback() { string userId=string.Empty,pwd=string.Empty; 验证(用户ID,pwd); } 公共无效submitWithFuncDelegate(Func funcDelegate) { stringuserid=string.Empty,pwd=string.Empty; funcDelegate(用户ID,pwd); } 公共无效提交事件() { stringuserid=string.Empty,pwd=string.Empty; validateEvent(用户ID,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();
}
}
公共类测试
{
静态int验证(字符串uid、字符串pwd)
{
//您的验证码
返回1;
}
void testValidate()
{
Func validateFunc=(uid,pwd)=>
{
//您的验证码
返回1;
};
FormTest.validateLogin vDel=新FormTest.validateLogin(验证);
FormTest v1=新的FormTest();
v1.validate=新的FormTest.validateLogin(vDel);
v1.submitWithcallback();
v1.submitWithFuncDelegate(validateFunc);
v1.validateEvent+=新FormTest.validateLogin(验证);
//或者使用匿名函数
v1.validateEvent+=(字符串uid、字符串pwd)=>{
//您的验证码
返回1;
};
v1.submitWithEvent();
}
}
LOL,与我刚刚写的内容非常接近:)+1对于great Mind,如果您要为模式窗口创建某种类型的父类并希望能够重用某些代码,我只会采用这种方法。
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();
}
}