C#这是授权和回调的情况吗?

C#这是授权和回调的情况吗?,c#,C#,我有一个处理用户登录的对象。此对象有一个名为LoginPopUp()的方法,该方法调用Login.show()以显示登录表单/窗口 窗体/窗口是一个单独的对象。当用户输入其详细信息并按submit时,我希望表单将数据传递回调用对象。然后,调用对象(处理登录的对象)将验证用户名和密码。如果用户在数据库中,它将关闭窗口 如果用户不在数据库中,它将保持打开状态并显示“不正确登录”。所以我需要一种方法,让调用对象将信息传递回登录窗口,告诉它它失败了 我对怎么做有点困惑。这是回调和委托的情况吗?在这种情况

我有一个处理用户登录的对象。此对象有一个名为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();
              }
          }