小新又闯祸了,妈妈让他去写检讨, 小新会有两个选择:
1 亲自乖乖的去写
2 一本正经的对小白说:“小白,帮我写检讨吧,我请你吃心点”...
我们用C#来模拟一下这个场景。
首先画出一个窗体,代表小新。
先放2个Button,Text分别为“亲自写”和“拜托小白”。
再放1个TextBox,代表小新检讨的纸。
定义个函数,小新写检讨
private void 写检讨(string str)
{
textBox1.Text = str.Trim();
}
亲自写当然很简单,在“亲自写”按钮中的Click事件中调用“写检讨”即可。问题是调皮的小新打算让小白去写。
当然现在要创建小白窗体了。放一个按钮,Text为“替小新写检讨”。
在小白窗体类中,定义一个delegate:
public delegate void 写检讨Handler(string str);
注意到“写检讨Handler”的返回值和参数都和“写检讨”都一模一样。
然后定义小白写检讨这个具体的事件:
public 写检讨Handler 替小新写检讨;
好了,小新小白都有了,现在小新要召唤小白了。在 小新窗体中的“拜托小白”按钮的Click事件里写:
private void button2_Click(object sender, EventArgs e)
{
// 召唤小白
littleWhite xiaobai = new littleWhite();
// 3 让小白知道该怎么写
xiaobai.替小新写检讨 += new littleWhite.写检讨Handler(写检讨);
xiaobai.ShowDialog();
}
聪明的小白被召唤出来了。小主人的要求当然得满足,于是在小白窗体的“替小新写检讨”的Click事件里写:
private void button1_Click(object sender, EventArgs e)
{
// 小白替小新写检讨
this.替小新写检讨("美芽我错了,汪汪~~");
this.DialogResult = DialogResult.OK;
}
好了,现在小新要请客小白吃心点了,不过妈妈看过以后估计要没收他所有的小熊饼干了。
完整代码见下:
小新窗体
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BossAsk
... {
public partial class frmMain : Form
...{
public frmMain()
...{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
...{
}
// 1 小新写检讨
private void 写检讨(string str)
...{
textBox1.Text = str.Trim();
}
/**//// <summary>
/// 亲自写
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
...{
写检讨("美芽,我错了...");
}
/**//// <summary>
/// 让小白去写
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
...{
// 召唤小白
littleWhite xiaobai = new littleWhite();
// 3 让小白知道该怎么写
xiaobai.替小新写检讨 += new littleWhite.写检讨Handler(写检讨);
xiaobai.ShowDialog();
}
}
}
小白窗体
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace BossAsk
... {
public partial class littleWhite : Form
...{
public littleWhite()
...{
InitializeComponent();
}
// 2 定义个代理,让小白模仿小新写检讨
public delegate void 写检讨Handler(string str);
// 定义小白写检讨
public 写检讨Handler 替小新写检讨;
private void littleWhite_Load(object sender, EventArgs e)
...{
}
private void button1_Click(object sender, EventArgs e)
...{
// 4 小白替小新写检讨
this.替小新写检讨("美芽我错了,汪汪~~");
this.DialogResult = DialogResult.OK;
}
}
}
这样的好处在于不必在小白窗体里引用小新窗体里的那张纸,降低窗体间的耦合度。