C#这是委托和回调的案例吗?

时间:2010-01-22 04:05:47

标签: c#

我有一个处理用户登录的对象。该对象有一个名为LoginPopUp()的方法,它调用Login.show()来显示Login窗体/窗口。

表单/窗口是一个单独的对象。当用户输入他们的详细信息并按下提交时,我希望表单将数据传递回调用对象。然后,调用对象(处理登录的对象)将验证用户名和密码。如果用户在数据库中,它将关闭窗口。

如果用户不在数据库中,它将保持打开状态并显示“登录错误”。所以我需要一种方法让调用对象将信息传递回登录窗口,告诉它失败了。

我对如何做到这一点感到困惑。这是回调和授权的情况吗?什么是传统解决方案在这种情况下使用?我想这会发生很多事情。

评论赞赏。

5 个答案:

答案 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)

你可以通过多种方式实现这一目标

  • 使用委托回调
  • 使用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);
    }
    }
    

并从你的班级中调用

   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);
相关问题