标签:
实现一个示例,封装一个登录控件,当用户名是admin密码是8888的时候提示登录成功背景色变成红色,然后用户可以自定义自己的操作(如记录登录时间,可以存放到记事本,可以存放到数据库,这里要看用户的需求),如果登录失败,背景色变红,提示登录失败。
首先我们用委托来实现,现在封装一个用户自定义控件(两个文本框,一个label,一个按钮),代码如下,eg:
internal MyDelegate myDelegate; public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.Trim() == "admin" && textBox2.Text.Trim() == "8888") { if (myDelegate != null) { myDelegate();//在此调用委托记录事件、记录时间等都可以,可以存放记事本,可以存放数据库 this.BackColor = Color.Green; label1.Text = "登录成功!"; } } else { this.BackColor = Color.Red; label1.Text = "登录失败!"; } }
委托,代码如下,eg:
internal delegate void MyDelegate();
主窗体调用,代码如下,eg:
private void Form1_Load(object sender, EventArgs e) { userControl11.myDelegate = Record; } public void Record() { Console.WriteLine(DateTime.Now +"登录成功!"); }
上面就是用委托实现的,但是如果我们这个时候可以添加一个按钮来假装调用上面的登录成功的事件/或者给按钮去掉登录事件,把上面主窗体(再增加两个按钮)的事件换成如下代码,我们来试验一下,代码如下,eg:
private void Form1_Load(object sender, EventArgs e) { userControl11.myDelegate = Record; } public void Record() { Console.WriteLine(DateTime.Now +"登录成功!"); } private void button1_Click(object sender, EventArgs e) { userControl11.myDelegate = null;//让成功登录这个事件失效,因为此时委托为null,不会去执行里面的登录成功代码 } private void button2_Click(object sender, EventArgs e) { Record();//此方法可以被手动调用了 }
如果我们把上面的委托换成事件呢?让我们来试验一下。
委托还是以前的代码,事件只不过是在声明委托的时候在前面添加了一个event关键字,用户自定义控件代码如下,eg:
internal event MyDelegate myDelegate;//在委托前面填加一个event关键字 public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text.Trim() == "admin" && textBox2.Text.Trim() == "8888") { if (myDelegate != null) { myDelegate();//记录事件、记录时间等都可以,可以存放记事本,可以存放数据库 this.BackColor = Color.Green; label1.Text = "登录成功!"; } } else { this.BackColor = Color.Red; label1.Text = "登录失败!"; } }
主窗体调用代码如下,eg:
private void Form1_Load(object sender, EventArgs e) { userControl11.myDelegate += Record; } public void Record() { Console.WriteLine(DateTime.Now +"登录成功!"); } private void button1_Click(object sender, EventArgs e) { userControl11.myDelegate -= Record;//只能通过+=、-=来操作事件绑定,可以防止用户手误操作赋值为null。 } private void button2_Click(object sender, EventArgs e) { Record();//此方法还可以被手动调用了 }
通过上面我们可以看出来事件也就是对委托的一个封装(封装成了一个private委托,一个+=方法一个-=方法),虽然我们声明的event是public的,但是编译器编译之后就会变成private的,所以只能在声明event的内部直接调用,而其他地方只能通过+=和-=进行操作。
下面我们对事件再次进行封装使它看起来更像系统的事件.
委托代码如下,eg:
internal delegate void MyDelegate(object sender,MyEventArgs args);
时间参数类代码如下,eg:
class MyEventArgs : EventArgs { private bool _isSuccess; private string _name; private string _pwd; public string Name { get; set; } public string Pwd { get; set; } public bool IsSuccess { get; set; } }
用户自定义控件代码如下,eg:
public partial class UserControl1 : UserControl { internal event MyDelegate myDelegate; public UserControl1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MyEventArgs myEventArgs = new MyEventArgs(); myEventArgs.IsSuccess = false; myEventArgs.Pwd = textBox2.Text; myEventArgs.Name = textBox1.Text; myDelegate(this, myEventArgs); if (myEventArgs.IsSuccess == true) { this.BackColor = Color.Green; label1.Text = "登录成功!"; } else { this.BackColor = Color.Red; label1.Text = "登录失败!"; } } }
主窗体代码如下,eg:
private void Form1_Load(object sender, EventArgs e) { userControl11.myDelegate += userControl11_myDelegate; } private void userControl11_myDelegate(object sender, MyEventArgs args) { if (args.Name == "admin" && args.Pwd == "8888") { args.IsSuccess = true; } else { args.IsSuccess = false; } }
上面的事件、委托和最后一个貌似不太搭边,等有时间再举一个好一点的例子。
标签:
原文地址:http://www.cnblogs.com/shoushangdeyu/p/4471874.html