您的位置:首页 > 编程语言 > C#

C#_event_事件

2015-11-27 13:55 465 查看
//-------------------事件---------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _04委托案例2_LogIn
{
public class LogInEventArgs
{
private string _userName;

public string UserName
{
get { return _userName; }
set { _userName = value; }
}

private string _userPwd;

public string UserPwd
{
get { return _userPwd; }
set { _userPwd = value; }
}

private bool _isValidateOK;

public bool IsValidateOK
{
get { return _isValidateOK; }
set { _isValidateOK = value; }
}

}
}


自声明的参数类
//--------------------利用事件实现登录验证 和 利用接口来实现登录验证的对比----------

---在开始之前,我们来添加一个用户自定义控件,叫UCLogInValidate.cs 类似这样的:



点击登录按钮 编辑其click事件:

//声明事件      本质就是将此委托私有,然后公有出两个方法  += -=
public event Func<string, string, bool> LogInValidate;
private void button1_Click(object sender, EventArgs e)
{
string userName = textBox1.Text.Trim();
string userPassword = textBox2.Text.Trim();
if (LogInValidate != null)
{
bool bo=LogInValidate(userName, userPassword);
if (bo)
{
this.BackColor = Color.Green;
}
else {
this.BackColor = Color.Red;
}
}
}


这里使用了系统自带的Func委托 带这么多参数看着很挫 稍后我们再使用Action ,这里先用着 和接口对比下

//自定义控件修改之后 记得重新生成

对于暴露的LogInValidate 我们在Form1加载时赋值方法:

private void ucLogIn1_Load(object sender, EventArgs e)
{
ucLogIn1.LogInValidate += ucLogIn1_LogInValidate;
}

bool ucLogIn1_LogInValidate(string arg1, string arg2)
{
return (arg1 == "cheng" && arg2 == "123") ? true : false;
}


好吧我知道这个验证好搓。。

注册好方法后点击自定义的控件中的登录就可以验证了。

下面我们来看看用接口来实现:

//----使用接口来实现登录

添加用户自定义控件 同上

在自定义控件中 编写 登录方法:

//定义接口
public ILogInValidateable _iUserValidate;

private void button1_Click(object sender, EventArgs e)
{
//1.收集信息
MyEventArgs arg = new MyEventArgs();
arg.IsValidateOK = false;
arg.UserName = textBox1.Text.Trim();
arg.UserPassword = textBox2.Text.Trim();

//2.调用接口验证
_iUserValidate.UserValidate(this, arg);             //通过对接口赋值  (实现该接口的子类对象)   调用的就是子类对象的方法

if (arg.IsValidateOK)
{
this.BackColor = Color.Green;
}
else
{
this.BackColor = Color.Red;
}
}


这里就没再使用 event,定义了一个ILogInValidateable接口变量, 其声明如下:

public interface ILogInValidateable
{
void UserValidate(object sender, MyEventArgs e);
}


//注意接口定义 接口中方法前不能加修饰符 默认 隐式公开

也定义了MyEventArgs类型 用来传递参数 ,其声明如下 :(也可以使其继承自EventArgs)

/// <summary>
/// 为了传递参数而设计的类
/// </summary>
public class MyEventArgs
{
private bool _isValidateOK;

public bool IsValidateOK
{
get { return _isValidateOK; }
set { _isValidateOK = value; }
}

private string _userName;

public string UserName
{
get { return _userName; }
set { _userName = value; }
}

private string _userPassword;

public string UserPassword
{
get { return _userPassword; }
set { _userPassword = value; }
}

}


然后拖拽此控件 在Form登录时 注册方法:

private void ucLogInValidate1_Load(object sender, EventArgs e)
{
ucLogInValidate1._iUserValidate = new Validating();
}


因为_iUserValidate是接口类型 赋值是 实现该接口的子类型对象: Validating声明如下:

public class Validating : ILogInValidateable
{
public void UserValidate(object sender, MyEventArgs e)
{
if (e.UserName == "Xuqingchi" && e.UserPassword == "HHHHH")
{
e.IsValidateOK = true;
}
else
{
e.IsValidateOK = false;
}
}
}


好吧,这验证也很搓,无视之^_~..

接下来验证就可以了:




什么?弱智的验证?

Never mind~

//Func参数太多?使用Action实现方法 就如上 传递自定义参数

public event Action<object sender,MyEventArgs e> _userValidate;

噢了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: