用户控件与窗体之间的传值:要实现当MineField中扫雷成功或失败,笑脸图标做出相应的改变。
1、通过构造函数传参
//MineField类中 public PictureBox smile; public MineField(PictureBox pb) { smile=pb; InitializeComponent(); } //在Form.Designer中的InitializeComponent里加入 this.mineField1 = new Mine.MineField(pictureBox1);
这样在MineField中便可以直接调用外面的PictureBox了。
但是会存在一个问题:窗体设计器生成的代码最好不要去修改,每次只要设计窗口一变动,Form.Designer里的代码就会重新生成,你添加的
this.mineField1 = new Mine.MineField(pictureBox1);
便无效,Form[设计]还会报很奇怪的异常。
2、通过事件触发机制
//在MineField中 public delegate void MineSweepedEventSuccessfullyHandler(); public event MineSweepedEventSuccessfullyHandler MineSweepedSuccessfully; public delegate void MineSweepedFalledHandler(); public event MineSweepedFalledHandler MineSweepedFalled; public void Falling() { if (MineSweepedFalled != null) { MineSweepedFalled(); } } public void Successful() { if (MineSweepedSuccessfully != null) { MineSweepedSuccessfully(); } } if(扫雷成功) Successful(); if(扫雷失败) Falling(); //触发事件 //Form中 private void Form1_Load(object sender, EventArgs e) { this.mineField1.Init(10, 10); this.mineField1.MineSweepedFalled +=事件处理函数名; this.mineField1.MineSweepedSuccessfully += 事件处理函数名; }
通过这个例子,我对事件这个概念有了更进一步的了解。